A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 许聪聪 中级黑马   /  2013-6-16 21:35  /  1501 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Single {

  2.         /**
  3.          * @param args
  4.          * 懒汉式的最终版
  5.          */
  6.         private static Single s= null;
  7.         private Single(){}
  8.         public static Single getInstance(){
  9.                 if(s==null){
  10.                         synchronized(Single.class){
  11.                                 if(s==null)
  12.                                         s=new Single();
  13.                         }
  14.                 }
  15.                 return s;
  16.         }       
  17. }
复制代码
希望高手 给加一个详细的 注释。有点看不懂 尤其是 同步锁里 为什么是 single.class.详细的 谢谢

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

5 个回复

倒序浏览
  1. //假设存在两个线程A和B
  2. public class Single
  3. {
  4.         private static Single s= null;
  5.         private Single(){}
  6.         public static Single getInstance()
  7.         {
  8.                 if(s==null)
  9.                 {   //2.由于A线程没有执行到s=new Single();所以没有新对象创建,可以通过这个s==null的判断。
  10.                         //但是由于同步代码块的关系,A没有放锁,所以B无法执行同步代码块。只能等待

  11.                         synchronized(Single.class)
  12.                         {//1。A线程运行到这个位置,失去了执行权,执行权由B获得
  13.                                 if(s==null)//4.如果A执行完同步代码块后失去执行权,则B可以继续执行,并进入同步代码块,
  14.                                                           //但是由于新对象已经被创建,这时s==null的判断为false,结束同步代码块,并执行return s;语句。
  15.                                 {                       
  16.                                         s=new Single();//3.如果A重新获取执行权,运行完同步代码块,就创建了新对象s= newSingle();
  17.                                 }
  18.                         }
  19.                 }
  20.                 return s;
  21.         }        
  22. }
复制代码
这是我笔记上自己加的注释,按照注释的序号顺序,个人感觉还算比较好理解。希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
  1. //假设存在两个线程A和B
  2. public class Single
  3. {
  4.         private static Single s= null;
  5.         private Single(){}
  6.         public static Single getInstance()
  7.         {
  8.                 if(s==null)
  9.                 {   //2.由于A线程没有执行到s=new Single();所以没有新对象创建,可以通过这个s==null的判断。
  10.                         //但是由于同步代码块的关系,A没有放锁,所以B无法执行同步代码块。只能等待

  11.                         synchronized(Single.class)
  12.                         {//1。A线程运行到这个位置,失去了执行权,执行权由B获得
  13.                                 if(s==null)//4.如果A执行完同步代码块后失去执行权,则B可以继续执行,并进入同步代码块,
  14.                                                           //但是由于新对象已经被创建,这时s==null的判断为false,结束同步代码块,并执行return s;语句。
  15.                                 {                       
  16.                                         s=new Single();//3.如果A重新获取执行权,运行完同步代码块,就创建了新对象s= newSingle();
  17.                                 }
  18.                         }
  19.                 }
  20.                 return s;
  21.         }        
  22. }
复制代码
这是我笔记上自己加的注释,按照注释的序号顺序,个人感觉还算比较好理解。希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
楼上的注释已经差不多了
我给你说下同步锁里 为什么是 single.class?
毕老师在视频中将到过的:
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象:
类名.class  该对象的类型是Class

静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class
上面是毕老师的原话,希望能看懂。。。。。。

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

回复 使用道具 举报
这里的锁 当学到后面多线程同步的时候就会遇到。

这里可以把他理解为一个“标志”,因为程序加载后会生成唯一的 类名.class文件,所以使用Single.class为了保证锁的唯一性,确保程序的同步。
回复 使用道具 举报
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马