單例模式的雙重檢查加鎖機制

        由於懶漢式的實現是線程安全的,因此會下降整個訪問速度,並且每次訪問都要判斷一次。有沒有更好的方式實現呢?能夠使用「雙重檢查枷鎖」的方式來實現。安全

        所謂「雙重檢查加鎖」機制,是指並非每次靜茹getInstance方法都須要同步,而是先不一樣步。當進入方法後,先檢查實力是否存在,若是不存在才進行下面的同步塊,着是第一次檢查,進入同步代碼塊,再次檢查實力是否存在。若是不存在,就在同步的狀況下建立一個實例,這是第二重檢查。這樣一來,整個過程只須要一次同步,從而減小了屢次在同步狀況下進行判斷所浪費的時間。spa

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        // 先檢查實例是否存在,若是不存在才進入下面的同步塊
        if(instance == null) {
            // 同步塊,線程安全的建立實例
            synchronized (Singleton.class) {
                // 再次檢查實例是否存在,若是不存在,才真正地建立實例
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
相關文章
相關標籤/搜索