我正在读Nir的“多处理器计算的艺术”。它解释了Java内存模型,并在第62页给出了一个示例:
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}并说:
这种模式曾经很常见,但却是不正确的。在第5行,构造函数调用似乎是在分配实例字段之前进行的,但是Java内存模型允许这些步骤无序进行,从而有效地使其他程序可以看到部分初始化的Singleton对象。
那么,这是否意味着这种同步可能不能保证我们从Singleton那里得到什么呢?
发布于 2015-03-21 19:54:44
那么,这是否意味着这种同步可能不能保证我们从Singleton那里得到什么呢?
这取决于你想从独生子女那里得到什么。如果您只想要一个实例,那么代码片段中的解决方案将实现这一点。如果您只想要一个实例,并且希望在访问它的时完全初始化该实例(这要求太多了吗?),那么,不,您不会通过代码片段来实现这一点。
另一个线程调用getInstance并读取instance字段的值
if (instance == null) {可能会看到指定的值引用尚未由控制器初始化的对象。由于该值不是null,所以该方法返回它,未初始化的对象泄漏。
这是通过将字段标记为volatile来修正的。
https://stackoverflow.com/questions/29187165
复制相似问题