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
  • JVM正确实现了JSR-133规范;即它符合Java 5及更高版本。

  • 我的来源是JSR-133 (Java Memory Model) FAQ - Jeremy Manson and Brian Goetz, February 2004。 Goetz在其他许多地方也证实了这一点。

    但是,正如Goetz所说,这是一个成语,它的时代已经过去。 Java中的无竞争同步现在很快,因此,如果需要进行延迟初始化,他建议您仅将getInstance()方法声明为synchronized。 (而且我想这也适用于其他语言...)

    此外,在所有条件都相同的情况下,编写可在Java 5中运行但在较旧的JVM中不可靠的代码是一个坏主意。

    好,那其他语言呢?好吧,这取决于习惯用法的实现方式,通常取决于平台。
  • C#-根据https://stackoverflow.com/a/1964832/139985,实例变量是否需要可变是取决于平台的。但是,Wikipedia表示,如果您确实使用volatile或显式的内存屏障,则可以安全地实现该习惯用法。
  • VB-根据Wikipedia,可以使用显式内存屏障安全地实现该惯用语。
  • C++-根据Wikipedia的说法,可以在Visual C++ 2005中使用volatile安全地实现该惯用语。但是​​其他消息来源说,一般而言,C++语言规范不能为volatile提供足够的保证。但是,可以在C++ 2011语言版本https://stackoverflow.com/a/6099828/139985的上下文中实现双重检查锁定。

  • (注意:我只是总结一些发现的资源,这些资源在我看来似乎是最近的……而且听起来不错。我不是C++,C#或VB专家。请阅读链接的页面并做出自己的判断。)

    07-24 09:45
    查看更多