gpt4 book ai didi

c# - "Double-Checked Locking is Broken"是仅限 Java 的东西吗?

转载 作者:太空狗 更新时间:2023-10-29 22:54:50 28 4
gpt4 key购买 nike

页面位于 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 中是安全的,前提是:

  1. 实例变量被声明为volatile, AND
  2. 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 专家。请阅读链接页面并做出你自己的判断。 )

关于c# - "Double-Checked Locking is Broken"是仅限 Java 的东西吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5958767/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com