天天看點

Singleton Pattern (單例or單件模式)的幾種實作方式

單例模式:確定一個類隻有一個執行個體,并提供一個全局的通路點。(比如:線程池,緩存,對話框)

單例模式的集中實作方式如下

1. 對性能不是很關鍵的應用程式中實作(經典模式)

public static Singleton mInstance;

    public static synchronized Singleton getInstance(){
        if (mInstance == null) {
            mInstance = new Singleton();
        }
        return mInstance;
    }
    
    private Singleton(){
    }           

由于添加關鍵字 synchronized處理多線程,但是這樣子同步會影響性能。因為每次我們調用這個單例時都要同步,其實實際上是隻有我們需要第一次建立mInstance時才需要同步。這種方式适合在。

2.項目中頻繁使用單例模式,性能也好

private static Singleton mInstance = new Singleton();

    public static Singleton getInstance(){
        return mInstance;
    }
    
    private Singleton(){
    }           

這個是在類加載的時候就建立了一個單例對象,以後我們在程式當中使用到的都是已經建立好的單例模式,這裡就沒有同步的限制,對程式運作方面的負擔不繁重。

3.雙重判斷枷鎖,使用同步同時不影響性能

public volatile static Singleton mInstance;

    public static Singleton getInstance() {
        if (mInstance == null) {
            synchronized (Singleton.class){
                if (mInstance == null) {
                    mInstance = new Singleton();
                }
            }
        }
        return mInstance;
    }

    private Singleton(){
    }           

這裡就隻有在第一次建立mInstance時使用同步加鎖,其他時候不需要使用同步,這就節省以後通路getInstance()方法的時間。同時 volatile關鍵字確定了多線程正确處理mInstance變量。這種方式也是對第一種方式的改善吧。(不适用于1.4及更早版本的java)

學習自《Head First 設計模式》----->單件模式

繼續閱讀