我经历了 Bill Pugh 在 Java 中实现单例设计模式的方法。
我对此感到担忧。如果我在任何地方错了,请纠正我。
请考虑以下 Bill Pugh 的代码:
public class Singleton {
// Private constructor prevents instantiation from other classes
private Singleton() { }
/**
* SingletonHolder is loaded on the first execution of Singleton.getInstance()
* or the first access to SingletonHolder.INSTANCE, not before.
*/
private static class SingletonHolder {
public static final Singleton INSTANCE = new Singleton(); // Line 10
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE; // Line 14
}
}
考虑“Thread-1”已调用“return SingletonHolder.INSTANCE;” 第 14 行。现在 Singleton 类将在第 10 行实例化。
在这个实例化完成之前,让我们说“Thread-1”被另一个线程“Thread-2”抢占了。当“Thread-2”调用“return SingletonHolder.INSTANCE;” 在第 14 行,
它会返回部分构造的对象吗?
如果它返回一个部分构造的对象,这种情况将是“乱序写入”。请让我知道我在上述情况下是否正确并分享您的想法。另外请让我知道是否可以通过任何其他方式克服这种情况。