1. 程式人生 > >走進設計模式的世界5:沒有例子,沒有故事,很嚴肅-單件模式

走進設計模式的世界5:沒有例子,沒有故事,很嚴肅-單件模式

單件模式:

單件模式:確保一個類只有一個例項,並提供一個全域性訪問點。

解釋:單件模式 確保程式中一個類最多隻有一個例項。單件模式也提供訪問這個例項的全域性點。在java中實現單件模式需要有私有的構造器、一個靜態方法和一個靜態變數。確定在效能和資源上的限制,然後小心的選擇適當的方案來實現單件,以解決多執行緒問題(我們必須認定所有的程式都是多執行緒的)。jdk5 之前的雙重檢查鎖單例會失效。如果使用多個類載入器單件模式也會失效。

以下是一個簡單的單件例子

/**

    簡單的單件實現

**/
public class Single{
    // 一個靜態變數
    private static Single single;
    // 一個私有的構造方法
    private Single(){};
    // 一個靜態方法
    private Single getInstance(){
        if(single!=null){
            single = new Single();
        }
        return single;
    }
}

上面這個例子簡單確完整的實現了單件模式,但是卻存在多執行緒的隱患。所以我們進行了修改,讓獲取例項的方法多執行緒和也可用。

/**

    鎖機制簡單的單件實現

**/
public class Single{
    // 一個靜態變數
    private static Single single;
    // 一個私有的構造方法
    private Single(){};
    // 一個靜態方法(對獲取的例項加鎖)
    private synchronized Single getInstance(){
        if(single!=null){
            single = new Single();
        }
        return single;
    }
}

這樣解決了多執行緒的問題,但是新的問題又出現了....就是效率問題,每次獲取例項就有可能被阻塞。如何進行優化呢?

 

/**

   雙重檢查鎖單件實現

**/
public class Single{
    // 一個靜態變數(運用了volatile關鍵字,讓single的改變直接放到共有記憶體區,保證變數的可見性)
    private volatile static Single single;
    // 一個私有的構造方法
    private Single(){};
    // 一個靜態方法(對獲取的例項加鎖)
    private synchronized Single getInstance(){
        if(single!=null){
            // 保證只有single屬性不為空的時候,對整個類加鎖。
            synchronized(Single.class){
                 single = new Single();
            }
        }
        return single;
    }
}

沒了。