Wikipedia上列出了 Java 中 Singleton 的一种实现:
public class SingletonDemo {
private static volatile SingletonDemo instance = null;
private SingletonDemo() {
}
public static SingletonDemo getInstance() {
if (instance == null) {
synchronized (SingletonDemo.class) {
if (instance == null) {
instance = new SingletonDemo();
}
}
}
return instance;
}
}
Java语言规范 17,第 5 段指出
当一个对象的构造函数完成时,它被认为是完全初始化的。只有在对象完全初始化后才能看到对该对象的引用的线程可以保证看到该对象的最终字段的正确初始化值。
好的,假设我们的 SingletonDemo 类有非 final 字段。那么,并发线程将能够读取默认值而不是构造函数中指定的正确值吗?