單例模式常用的的兩種寫法

Dusan_杜小菜發表於2016-05-07

單例模式很常用,但是寫法各異,哪種更合理高效呢。一般單例都是五種寫法。懶漢式,餓漢式,雙重校驗鎖,列舉和靜態內部類。什麼時候用懶漢式,何時用餓漢式應該清楚。

一, 單例模式特點:

1)一個類只有一個例項。
2)它必須自行建立這個例項。
3)它必須自行向整個系統提供這個例項。

二,懶漢式+雙重校驗鎖

懶漢式,類載入時不初始化例項,可以延遲載入例項。通過getInstance()方法,並且它的構造方法是private的,這樣就保證了只能有一個物件存在。雙重檢查鎖定才能夠正常達到單例效果。執行緒安全,更高效。

public class MyOkHttpUtils {
    public static OkHttpClient okHttpClient;
    public static MyOkHttpUtils myOkHttpUtils;
    public static MyOkHttpUtils getInstance()
    {
        if (myOkHttpUtils == null) {
            synchronized (MyOkHttpUtils.class) {
                if (myOkHttpUtils == null) {
                    myOkHttpUtils = new MyOkHttpUtils();
                }
            }
        }
        return myOkHttpUtils;
    }
    private MyOkHttpUtils()
    {
        if (okHttpClient == null) {
            OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
            okHttpClientBuilder.connectTimeout(5, TimeUnit.SECONDS);
            okHttpClient = okHttpClientBuilder.build();
        }
    }
}

首先判斷instance是不是為null,如果為null,加鎖初始化;如果不為null,直接返回instance。 這就是double-checked locking設計實現單例模式。平時這樣用,強烈推薦。

三,餓漢式單例模式

餓漢式單例模式,在類載入時就完成了初始化,所以類載入較慢,但獲取物件的速度快。這種單例模式寫法:

    //在訪問HttpMethods時建立單例
    private static class SingletonHolder{
        private static final HttpMethods INSTANCE = new HttpMethods();
    }

    //獲取單例
    public static HttpMethods getInstance(){
        return SingletonHolder.INSTANCE;
    }

四,總結

在專案中,經常使用雙重校驗鎖實現懶漢式單例模式,執行緒安全,高效。比如下載管理器,okHttpClient例項,確保整個專案只有一個例項,資源有效利用。
未完待續,杜乾,Dusan ,Q 291902259

相關文章