是"双重检查锁定是破碎"只有java的东西?

Pac*_*ier 15 c# java vb.net multithreading synchronization

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

我读过双重检查锁定模式:是否破碎?,这是双重检查锁定?,如何解决Java中的"双重检查锁定"声明?说实话,我不知道共同的共识是什么.有人说是的,其他人说不.

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

Ste*_*n C 9

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

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

我的来源是JSR-133(Java内存模型)常见问题解答 - Jeremy Manson和Brian Goetz,2004年2月.Goetz在其他许多地方都证实了这一点.

然而,正如格茨所说,这是一个时间已经过去的成语.Java中的无对称同步现在很快,因此他建议您只需将getInstance()方法声明为synchronized需要进行延迟初始化.(我想这也适用于其他语言......)

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


好的,那么其他语言怎么样?嗯,这取决于如何成语实施,并经常在平台上.

  • C# - 根据/sf/answers/137538271/,它是平台相关的,实例变量是否需要是volatile.然而,维基百科说,如果你使用volatile或明确的记忆障碍,成语可以安全地实施.

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

  • C++ - 根据维基百科,可以使用volatileVisual C++ 2005 安全地实现这个习惯用法.但是其他消息来源说,一般而言,C++语言规范并不能提供足够的保证volatile.但是,可以在C++ 2011语言修订版本的上下文中实现双重检查锁定- /sf/answers/426987991/.

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

  • @TJ - 我知道,但问题也散布了错误的信息,值得在正确的答案中予以纠正.注释没有提供足够的空间来执行此操作. (3认同)