【问题标题】:why is double checked locking still discouraged even after the volatile fix?为什么即使在 volatile 修复之后仍然不鼓励双重检查锁定?
【发布时间】:2016-08-17 16:16:17
【问题描述】:

Reference article on JMM

值得注意的是,在新的内存模型下,像双重检查锁定这样的损坏技术仍然被破坏,并且“修复”双重检查锁定并不是新内存模型努力的目标之一。 (然而,volatile 的新语义允许双重检查锁定的常用替代方法之一正常工作,尽管仍然不鼓励使用该技术。)

相关讨论:

我可以理解为什么没有volatile 修复它会损坏。但我不知道为什么即使在修复之后仍然不鼓励它。我注意到其中一个讨论存在一些分歧。但如果它真的像参考建议的那样?仍然不鼓励使用此固定版本的原因可能是什么?

【问题讨论】:

  • 因为有更好的选择?对于单例模式,例如使用枚举是推荐的方式。
  • 因为很容易弄错,很难弄错并保持正确,因为基本上没有比实现相同目标的更简单、不那么微妙的技术有任何优势。
  • 我同意之前的两个 cmets,但如果你弄错了,这很难告诉。即它可能对您“看起来正确”,但实际上是错误的。最好采用已知有效的模式,而不是尝试走自己已经走过的漫长道路。
  • 可能是因为同步对于大多数情况来说已经足够好了,甚至可能比 DCL 更好。 HotSpot 在运行时根据争用调整锁的行为。它used to default to biased locking,现在它默认为 CAS 风格的轻量级锁定,如有必要,提升为重量级的实际线程暂停 as explained here。

标签: java volatile


【解决方案1】:

首先:在新的 Java MM 中,双重检查锁定惯用语不会被破坏了。因此,您可以在 Java 中安全地使用它。

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

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

【讨论】:

  • 你能链接一下它现在没有损坏的参考吗?
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
相关资源
最近更新 更多