黑马程序员技术交流社区

标题: 单例设计模式问题 [打印本页]

作者: dzzgml    时间: 2015-5-10 15:58
标题: 单例设计模式问题
  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. }
复制代码
为什么要添加两次锁?而且为什么要判断两次?




作者: 痲ボㄋ.    时间: 2015-5-10 19:17
只需要进行一次锁就可以了,但是两次判断可以提高效率,不用每次都判断锁;例如:
  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对象了,这样保证了对象的唯一也不会频繁判断锁了。
作者: 敢舍弃么    时间: 2015-5-10 19:22
是为了提高运行效率,节省资源
作者: dzzgml    时间: 2015-5-11 09:05
痲ボㄋ. 发表于 2015-5-10 19:17
只需要进行一次锁就可以了,但是两次判断可以提高效率,不用每次都判断锁;例如:

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

  懂了!解释的很清楚。
作者: 快乐Anne    时间: 2015-5-11 09:18
楼上正解,解释的很明白
作者: iamnoten    时间: 2015-5-11 10:35
不觉得第二个锁有什么用
作者: dzzgml    时间: 2015-5-11 11:31
iamnoten 发表于 2015-5-11 10:35
不觉得第二个锁有什么用

看视频上面是这么弄的,所以我也有点不懂。
作者: fenglinluomu    时间: 2015-5-11 12:05
双重判断是为了挽回一点加锁损失的效率。
作者: qinhaihang    时间: 2015-5-11 13:01
iamnoten 发表于 2015-5-11 10:35
不觉得第二个锁有什么用

楼主记错了吧,我也刚好看到这里,但是没有加两次锁啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2