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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dzzgml 中级黑马   /  2015-5-10 15:58  /  675 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Single{
  2.         private static Single s = null;
  3.         private Single(){}
  4.         public static Single getInstance(){
  5.                 if(s==null){
  6.                   synchronized(Single.class){
  7.                           if(s==null){
  8.                                   synchronized(Single.class){
  9.                                           s = new Single();
  10.                                   }
  11.                           }
  12.                   }
  13.           }
  14.                 return s;
  15.         }
  16. }
复制代码
为什么要添加两次锁?而且为什么要判断两次?



8 个回复

正序浏览
iamnoten 发表于 2015-5-11 10:35
不觉得第二个锁有什么用

楼主记错了吧,我也刚好看到这里,但是没有加两次锁啊
回复 使用道具 举报
双重判断是为了挽回一点加锁损失的效率。
回复 使用道具 举报
dzzgml 中级黑马 2015-5-11 11:31:27
7#
iamnoten 发表于 2015-5-11 10:35
不觉得第二个锁有什么用

看视频上面是这么弄的,所以我也有点不懂。
回复 使用道具 举报
不觉得第二个锁有什么用
回复 使用道具 举报
楼上正解,解释的很明白
回复 使用道具 举报
痲ボㄋ. 发表于 2015-5-10 19:17
只需要进行一次锁就可以了,但是两次判断可以提高效率,不用每次都判断锁;例如:

当A线程进入到第二个if ...

  懂了!解释的很清楚。
回复 使用道具 举报
是为了提高运行效率,节省资源
回复 使用道具 举报
只需要进行一次锁就可以了,但是两次判断可以提高效率,不用每次都判断锁;例如:
  1. public static Single getInstance(){
  2.          if(s==null){
  3.               synchronized(Single.class){
  4.                      if(s==null)
  5.                             s = new Single();
  6.                }
  7.           }
  8. }
复制代码

当A线程进入到第二个if语句,持有锁;这时CPU执行B线程,进行第一次if判断 s = null;
但是再执行时发现锁已经被其他线程占用了,就等待;再次等CPU执行A线程时,s 已经通过new
关键字指向了一个对象,就不为空了;再当cup执行B时,s已经部位null,所以就不会再new对象了,这样保证了对象的唯一也不会频繁判断锁了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马