为什么要仔细检查单例实例化
Why to double check the singleton instantiation
在this link中我发现单例实例化如下:
public static Singleton getInstanceDC() {
if (_instance == null) { // Single Checked (1)
synchronized (Singleton.class) {
if (_instance == null) { // Double checked
_instance = new Singleton();
}
}
}
return _instance;
}
我不明白单一检查的意义,即 (1)。它在这里有什么用,单线程将检查同步块内的实例,那么使用第一次检查有什么意义?
考虑在多线程环境中,两个线程可以访问您的单例。
如果不仔细检查,可能会发生以下情况。
第一个线程进入getInstanceDC()
; _instance
是 null
所以它进入 if
块。
第二线程进入getInstanceDC()
; _instance
是 null
所以它进入 if
块。
第一个线程创建一个新实例。
第二个线程创建一个新实例。
同步块中的双重检查解决了这个问题。
那么为什么不同步整个方法呢?答案是出于性能原因。
在this link中我发现单例实例化如下:
public static Singleton getInstanceDC() {
if (_instance == null) { // Single Checked (1)
synchronized (Singleton.class) {
if (_instance == null) { // Double checked
_instance = new Singleton();
}
}
}
return _instance;
}
我不明白单一检查的意义,即 (1)。它在这里有什么用,单线程将检查同步块内的实例,那么使用第一次检查有什么意义?
考虑在多线程环境中,两个线程可以访问您的单例。 如果不仔细检查,可能会发生以下情况。
第一个线程进入getInstanceDC()
; _instance
是 null
所以它进入 if
块。
第二线程进入getInstanceDC()
; _instance
是 null
所以它进入 if
块。
第一个线程创建一个新实例。
第二个线程创建一个新实例。
同步块中的双重检查解决了这个问题。
那么为什么不同步整个方法呢?答案是出于性能原因。