维基百科上列出了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;
}
}
Run Code Online (Sandbox Code Playgroud)
有Java语言规范17条第5款指出,
当构造函数完成时,对象被认为是完全初始化的.在该对象完全初始化之后只能看到对象引用的线程可以保证看到该对象的最终字段的正确初始化值.
好吧,想象一下我们的SingletonDemo类有非final字段.那么,并发线程将能够读取默认值而不是构造函数中指定的正确值吗?