为什么要仔细检查单例实例化

时间:2015-03-16 16:48:46

标签: java singleton double-checked-locking

this链接中,我发现单例实例化如下:

public static Singleton getInstanceDC() {
        if (_instance == null) {                // Single Checked (1)
            synchronized (Singleton.class) {
                if (_instance == null) {        // Double checked
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
}

我没有得到单一检查的意义,即(1)。在这里使用什么方式单线程将检查同步块内的实例,那么使用第一次检查有什么意义呢?

1 个答案:

答案 0 :(得分:3)

考虑在多线程环境中,两个线程可以访问您的单例。 如果没有仔细检查,可能会发生这种情况。

第一个帖子进入getInstanceDC(); _instancenull,因此会进入if区块。 第二个帖子进入getInstanceDC(); _instancenull,因此会进入if区块。 第一个线程创建一个新实例。 第二个线程创建一个新实例。

同步块中的双重检查解决了这个问题。

那为什么不同步整个方法呢?答案是出于性能原因。