用代碼講清-單例模式(二)


GitHub Demo 傳送門

懶漢式-雙重校驗

示例代碼

public class Single03 {
    private static volatile Single03 INSTANCE;
    private Single03(){
    }

    /**
     * 通過兩個判斷進行檢測,保證線程安全
     * @return
     */
    public static Single03 getInstance(){
        if(INSTANCE == null){
            synchronized (Single03.class){
                if (INSTANCE == null){
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new Single03();
                }
            }
        }
        return INSTANCE;
    }
 }

輸出示例
雙重校驗
上述方式,還是針對多線程下的單例模式處理。雙重校驗與文章(一)懶漢模式的區別在於
1、我們不在是對整個方法加鎖,而是在需要的時候進行加鎖
2、我們通過雙重判斷,判斷對象是否創建。如已創建,直接釋放鎖。

懶漢式-靜態內部類

單例中優美的實現方式
示例代碼

public class Single04 {
    private Single04() {
    }

    private static class Single04Holder {
        private static final Single04 INSTANCE = new Single04();
    }

    public static Single04 getInstance() {
        return Single04Holder.INSTANCE;
    }
}

輸出示例
靜態內部類
靜態內部內的形式,優美的解決了如下兩個問題
1、解決什麼時候用什麼時候加載的問題
2、解決線程安全的問題

通過兩篇文章對單例模式進行了解讀,希望能給大家做個引導。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章