关于我提出的previous question,
public static Singleton getInstanceDC() {
if (_instance == null) { // Single Checked (1)
synchronized (Singleton.class) {
if (_instance == null) { // Double checked (2)
_instance = new Singleton();
}
}
}
return _instance;
}
为什么我应该使用第二个实例null检查条件。它可能产生什么影响?
答案 0 :(得分:4)
让我们编号行,这样我们就可以看到线程如何交错操作。
if (_instance == null) { // L1
synchronized (Singleton.class) { // L2
if (_instance == null) { // L3
_instance = new Singleton();// L4
}
}
}
让我们考虑交错而不检查L3。
_instance
为null
_instance
为null
创建了Singleton
的两个实例。每个线程都返回自己的实例。
在L3检查时,步骤8没有发生,因为在第7步,线程2的_instance
视图与线程1同步,因此只创建了Singleton
的一个实例。