黑马程序员技术交流社区

标题: 在多线程单例模式中,DCL失效解决方法 [打印本页]

作者: pp7803515    时间: 2015-7-2 18:53
标题: 在多线程单例模式中,DCL失效解决方法
本帖最后由 pp7803515 于 2015-7-2 19:04 编辑
  1. class Single {
  2.         private static Single s = null;

  3.         private Single() {
  4.         }

  5.         public static Single getInstance() {
  6.                 if (s == null) {
  7.                         synchronized (Single.class) {
  8.                                 if (s == null) {
  9.                                         s = new Single();
  10.                                 }
  11.                         }
  12.                 }
  13.                 return s;
  14.         }
  15. }
复制代码
这是一个常见的DCL单例模式。我想问下,在private static Single s = null;这句代码改为private static volatile Single s = null;是如何避免了DCL失效的呢?
还有一个小问题。单例模式中创建对象的方法也是静态的啊。这样单例模式和普通的静态方法到底有什么区别呢?

作者: pp7803515    时间: 2015-7-2 19:05
有没有大神解答一下?
作者: pp7803515    时间: 2015-7-3 00:50
自己顶一下,有没有大神解答一下
作者: 慕容旺财    时间: 2015-7-3 18:21
问下什么是DCL单例模式???
作者: pp7803515    时间: 2015-7-9 18:12
慕容旺财 发表于 2015-7-3 18:21
问下什么是DCL单例模式???

在单例模式下,就是在多线程的时候,为了提高锁的效率,用双检锁(DoubleCheckedLock)。然后我百度的时候,发现有人说要加多一个volatile 来避免DoubleCheckedLock失效。我就想知道这个具体的原理是什么




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