0

链接中,我找到了如下的单例实例化:

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

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

4

1 回答 1

3

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

第一个线程进入getInstanceDC()_instancenull这样它进入if块。第二个线程进入getInstanceDC()_instancenull这样它进入if块。第一个线程创建一个新实例。第二个线程创建一个新实例。

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

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

于 2015-03-16T16:53:48.530 回答