【发布时间】:2016-08-17 16:16:17
【问题描述】:
值得注意的是,在新的内存模型下,像双重检查锁定这样的损坏技术仍然被破坏,并且“修复”双重检查锁定并不是新内存模型努力的目标之一。 (然而,volatile 的新语义允许双重检查锁定的常用替代方法之一正常工作,尽管仍然不鼓励使用该技术。)
相关讨论:
- Why Double checked locking is 25% faster in Joshua Bloch Effective Java Example
- Why is double-checked locking broken in Java?
我可以理解为什么没有volatile 修复它会损坏。但我不知道为什么即使在修复之后仍然不鼓励它。我注意到其中一个讨论存在一些分歧。但如果它真的像参考建议的那样?仍然不鼓励使用此固定版本的原因可能是什么?
【问题讨论】:
-
因为有更好的选择?对于单例模式,例如使用枚举是推荐的方式。
-
因为很容易弄错,很难弄错并保持正确,因为基本上没有比实现相同目标的更简单、不那么微妙的技术有任何优势。
-
我同意之前的两个 cmets,但如果你弄错了,这很难告诉。即它可能对您“看起来正确”,但实际上是错误的。最好采用已知有效的模式,而不是尝试走自己已经走过的漫长道路。
-
可能是因为同步对于大多数情况来说已经足够好了,甚至可能比 DCL 更好。 HotSpot 在运行时根据争用调整锁的行为。它used to default to biased locking,现在它默认为 CAS 风格的轻量级锁定,如有必要,提升为重量级的实际线程暂停 as explained here。