Android_杜小菜_移動開發技術專欄
阿新 • • 發佈:2019-02-14
單例模式很常用,但是寫法各異,哪種更合理高效呢。一般單例都是五種寫法。懶漢式,餓漢式,雙重校驗鎖,列舉和靜態內部類。什麼時候用懶漢式,何時用餓漢式應該清楚。
一, 單例模式特點:
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