【发布时间】:2016-06-27 14:29:18
【问题描述】:
我对@987654322@内部有很好的了解,对volatile内部有基本的了解。
我有一个查询,这是对以下 SE 问题的跟进:
Why is volatile used in this example of double checked locking
我对某一部分感到困惑。如果我严格遵循上面的示例,我必须将volatile 添加到许多变量中,但我确信所有多线程应用程序都没有使用这种 volatile + synchronized 组合。
如果synchronization 不保证内存一致性,如上例所示,使用volatile 变量与synchronization 代码组合的用例是什么?
【问题讨论】:
-
注意:实际上对单例使用双重检查锁定是一个坏主意,因为a)单例,b)您可以使用
enum -
我肯定会使用其他一些选项,例如枚举、延迟加载程序。刚刚添加了该问题以通过一些工作代码提供上下文。我的困惑只是关于组合。
-
双重检查锁定用于单例对象的延迟初始化。此外,volatile 可以防止可能发生的优化:“此关键字可以防止编译器尝试优化代码以便在对象完成构建之前对其进行访问的微妙情况”(OCP Oracle® Certified Professional Java® SE 8 Programmer二)
-
如果您不在 Singleton 上使用其他静态方法或变量,则 Singleton 最简单的解决方案是使用 Eager 解决方案。另一种方法是使用枚举,或使用持有者类成语
标签: java multithreading synchronized volatile