http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html上的页面说,Java中的双重检查锁定存在缺陷。我只是想知道它是否也适用于其他语言(C#,Vb,C++等)
我读过Double checked locking pattern: Broken or not?,Is this broken double checked locking?和How to solve the "Double-Checked Locking is Broken" Declaration in Java?是真实的,我不知道什么是共识。有人说是的,它坏了,有人说不。
无论如何,我的问题是它是否也适用于其他语言(C#,Vb,C++等)
最佳答案
双重检查锁定在Java中是安全的,提供了:
volatile
和AND 我的来源是JSR-133 (Java Memory Model) FAQ - Jeremy Manson and Brian Goetz, February 2004。 Goetz在其他许多地方也证实了这一点。
但是,正如Goetz所说,这是一个成语,它的时代已经过去。 Java中的无竞争同步现在很快,因此,如果需要进行延迟初始化,他建议您仅将
getInstance()
方法声明为synchronized
。 (而且我想这也适用于其他语言...)此外,在所有条件都相同的情况下,编写可在Java 5中运行但在较旧的JVM中不可靠的代码是一个坏主意。
好,那其他语言呢?好吧,这取决于习惯用法的实现方式,通常取决于平台。
volatile
或显式的内存屏障,则可以安全地实现该习惯用法。 volatile
安全地实现该惯用语。但是其他消息来源说,一般而言,C++语言规范不能为volatile
提供足够的保证。但是,可以在C++ 2011语言版本https://stackoverflow.com/a/6099828/139985的上下文中实现双重检查锁定。 (注意:我只是总结一些发现的资源,这些资源在我看来似乎是最近的……而且听起来不错。我不是C++,C#或VB专家。请阅读链接的页面并做出自己的判断。)