誰動了我的Girl的窩
阿新 • • 發佈:2018-12-15
本文程式碼使用的語言為C#,請使用別的語言的同學自行轉換為自己習慣的語言
談到單例模式,首先要明確為什麼要使用單例模式?
目的:保證一個類僅有一個例項物件,並且該物件全域性共享
方法:構造私有化,屬性或方法公開化
1、最簡單的單例模式:餓漢式 由於在類被載入的時候就會建立類物件,所以叫做餓漢式
public class Singleton1 { //餓漢式單例 private static Singleton1 instance = new Singleton1(); private Singleton1() { } public static Singleton1 Instance() { return instance; } }
2、懶漢式-單例模式 由於我們並不想在程式載入的時候就建立所有的類物件,我們只需要在第一次使用類的時候才建立類物件,這時候便有了懶漢式(你要,我就給,你不要,我不給)
懶漢式一:執行緒不安全
public class Singleton2 { private static Singleton2 instance; private Singleton2() { } public static Singleton2 Instance{ get{ if (instance == null) { //如果第一次使用該類,則建立類物件 instance = new Singleton2(); } return instance; } } }
懶漢式二:執行緒安全,但是有可能建立多個物件 舉例:當兩個執行緒同時訪問未使用過的Instance時,兩個執行緒都判斷instance為null,這時候,第一個執行緒進入建立instance物件,而第二個執行緒等待執行緒鎖開啟,有序進入又建立了一次instance物件
public class Singleton3 { private static Singleton3 instance; private static readonly object ob = new object(); private Singleton3() { } public static Singleton3 Instance { get { if (instance == null) { lock (ob) { instance = new Singleton3(); } } return instance; } } }
懶漢式三:執行緒安全並且物件唯一(推薦使用)
public class Singleton4 {
private static Singleton4 instance;
private static readonly object ob = new object();
private Singleton4() { }
public static Singleton4 Instance {
get {
//先判斷一次instance物件是否為null
if (instance == null) {
//加鎖
lock (ob) {
//再判斷當前instance物件是否為null
if (instance == null) {
instance = new Singleton4();
}
}
}
return instance;
}
}
}
綜合以上單例模式,保證執行緒安全並且滿足單例要求的有最簡單的餓漢式和懶漢式三這兩種方式。
兩種模式各有利弊,餓漢式的好處是:非常簡單,在類載入的時候便建立了類物件等待使用,所以也不存線上程安全問題
壞處是:有時候我們並不一定在開始就使用到當前類,就會造成資源的浪費
懶漢式的好處是:只有在使用的時候,才會建立類物件,可以有效地利用資源,儘量減少浪費
壞處是:你看到了,程式碼很囉嗦...