“双重检查锁定已损坏”是Java独有的吗?

http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html 的页面说,双重检查的锁定在java中存在缺陷。我只是想知道它是否也适用于其他语言(C#,Vb,C++等)

我读过双检查锁定模式:破碎与否?这是双重检查锁定吗?如何解决Java中的“双重检查锁定已损坏”声明?说实话,我不知道共同的共识是什么。有人说是的,它坏了,有人说不。

无论如何,我的问题是它是否也适用于其他语言(C#,Vb,C++等)


答案 1

双重检查锁定在Java中是安全的,前提是:

  1. 实例变量声明为 、 和volatile
  2. JVM正确实现了JSR-133规范;即它符合Java 5及更高版本。

我的源代码是JSR-133(Java Memory Model)FAQ - Jeremy Manson和Brian Goetz,2004年2月。Goetz在其他一些地方也证实了这一点。

然而,正如Goetz所说,这是一个时代已经过去的成语。Java中的无控制同步现在很快,因此他建议您只声明该方法,就好像您需要进行惰性初始化一样。(我想这也适用于其他语言...getInstance()synchronized

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


好吧,那么其他语言呢?好吧,这取决于成语是如何实现的,而且通常是在平台上。

  • C# - 根据 https://stackoverflow.com/a/1964832/139985实例变量是否需要易失性取决于平台。但是,维基百科说,如果您确实使用或显式使用内存屏障,则可以安全地实现该成语。volatile

  • VB - 根据维基百科,该成语可以使用显式内存屏障安全地实现。

  • C++ - 根据维基百科,该成语可以在Visual C++ 2005中安全地实现。但其他消息来源说,一般来说,C++语言规范并没有提供足够的保证来保证。但是,可以在C++ 2011 语言修订版的上下文中实现双重检查锁定 - https://stackoverflow.com/a/6099828/139985volatilevolatile

(注意:我只是总结了我发现的一些来源,这些来源在我看来是最近的......和声音。我不是C++,C#或VB专家。请阅读链接的页面并做出自己的判断。


答案 2

这篇维基百科文章涵盖了java,c ++和.net(c#/vb)http://en.wikipedia.org/wiki/Double-checked_locking