【发布时间】:2011-12-12 22:21:18
【问题描述】:
从Head First设计模式一书中,具有双重检查锁定的单例模式已实现如下:
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
我不明白为什么要使用 volatile。 volatile 的使用不会破坏使用双重检查锁定的目的,即性能吗?
【问题讨论】:
-
我以为双重检查锁定被破坏了,有人修复了吗?
-
对于它的价值,我发现 Head First 设计模式是一本可怕的学习书。当我回顾它时,现在我已经在其他地方学习了模式,这是完全有道理的,但是在不知道模式的情况下学习它真的没有达到它的目的。但它非常受欢迎,所以也许只是我太密集了。 :-)
-
@DavidHeffernan 我已经看到这个示例被用作可以信任 jvm 执行 DCL 的一种方式。
-
FWIW,在 x86 系统上,易失性读取应该导致无操作。事实上,唯一需要为内存一致性设置栅栏的操作是 volatile Write-Read。所以如果你真的只写一次值,那么影响应该很小。我还没有看到有人真正对此进行基准测试并认为结果会很有趣!
-
查看此链接了解为什么在单例中使用
volatile:cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
标签: java design-patterns locking singleton double-checked-locking