1. 程式人生 > >Android_杜小菜_移動開發技術專欄

Android_杜小菜_移動開發技術專欄

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

一, 單例模式特點:

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