java - 为什么即使在 volatile 修复之后仍然不鼓励双重检查锁定?

标签 java volatile

Reference article on JMM

It is worth noting that broken techniques like double-checked locking are still broken under the new memory model, and that "fixing" double-checked locking was not one of the goals of the new memory model effort. (However, the new semantics of volatile allow one of the commonly proposed alternatives to double-checked locking to work correctly, although the technique is still discouraged.)

相关讨论:

我能理解为什么它在没有 volatile 修复的情况下被破坏。但我不知道为什么即使在修复之后仍然不鼓励它。我注意到其中一次讨论中存在一些分歧。但如果它真的如引用所建议的那样?仍然不鼓励使用此固定版本的原因是什么?

最佳答案

所以首先:在新的 Java MM 中,双重检查锁定惯用语不再不再被破坏。所以你可以安全地在 Java 中使用它。

还有一些情况无法使用所有其他替代方案(如枚举或静态初始化)。例如,如果您需要访问非静态引用以构建单例。

所以只要完全理解成语就可以放心使用。

关于java - 为什么即使在 volatile 修复之后仍然不鼓励双重检查锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39001653/

相关文章:

java - Jackson @JsonIgnoreProperties - 组合规则

java - 可以强制执行应用程序中所有文件的静态 block 吗?

java - RxJava : Filtering a List in an Observable (in place)

c# - C# 中的 volatile 变量赋值

c++ - 我们可以用 `const_cast`来修饰一个常量吗?

Java8 列表返回元素或 null

java - M2Eclipse 显示错误,但 Maven 编译正常

java - synchronized 和 volatile 在 Java 内存模型中如何工作?

java - 即使没有 volatile ,线程值也不会被线程缓存?

c++ - 带有空主体的while循环检查 volatile 整数-这是什么意思?