單例模式分為兩種,懶漢式和餓漢式。首先看懶漢式:
public class a()
public static a getinstance()
return a;
}}
再來看餓漢式。
public class a()
public static a getinstance()
}
懶漢式在執行getinstance方法時,判斷條件成立才會例項化物件,餓漢式則在類建立時就例項化物件。
很多時候,單例模式還要考慮多執行緒的問題,餓漢式本身就是執行緒安全的(測試了a可以不加final,不過加上更直觀),而懶漢式則不是執行緒安全的。因為執行緒執行順序不確定,假設剛好了幾個執行緒同時訪問,這幾個執行緒檢測到a都是null,就會建立多個物件。解決這個問題很簡單,只要加鎖就可以了。
public synchronized static a getinstance()
return a;
}
這樣寫基本就沒問題了,不過我們還可以對加鎖的位置進行優化,對整個函式加鎖雖然方便,但效能並不是最優的,我們真正需要加鎖的其實只有if語句塊,所以我們可以只在這個位置加鎖。
public static a getinstance()
}return a;
}
寫到這裡,你會想,好了,效能優化也完成了,但真是這樣嗎。再細心分析,雖然我們將鎖的範圍縮小了,可是考慮到這裡本來就只有三條語句,我們僅僅這樣寫,其實和之前對整個函式加鎖是差不多的。仔細分析就會發現,我們每次執行方法,執行緒都會持有鎖,而不管a是不是已經建立了。我們可以針對這點再優化,只有a為空的時候才持有鎖。
public static a getinstance()
}}
return a;
}
這樣就不必每次執行都持有鎖,提高了效能。這種技巧叫做雙重鎖定,大家可以去查一下。 小白學設計模式 單例模式(singleton)
乙個類有且僅有乙個全域性例項,並且提供乙個訪它的全域性訪問點。單例模式讓自身儲存自己的唯一例項,使得這個類保證沒有其他例項可以被建立,從而提供乙個訪問該例項的方法。singleton 定義乙個instance操作,允許客戶訪問他的唯一例項,instance是乙個類操作,它可能負責建立他自己的唯一例項...
小話設計模式(一)單例模式
那麼具體要求是什麼樣的呢?簡而言之,在程式執行期間,單例類的例項只能有乙個 或沒有 恩?說好的是類似於全域性變數的東西呢?當然為了能在程式任何地方呼叫它,需要為它實現乙個靜態方法 例如getinstance 通過這個方法可以獲得單例類的唯一例項。廢話不多說直接上c public class sing...
小話設計模式二 單例模式
單例模式定義 只有乙個例項,單例模式確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。這個類稱為單例類。單例模式特點 1 這個類只能有乙個例項 2 這個類必須自行建立這個例項 3 這個類必須自行向整個系統提供這個例項 單例模式解析 下面是單例模式的uml圖 下面是簡單 實現 單例模式...