標籤:換工作 on() 簡介 color src 機制 exp 解鎖 singleton
最近在換工作,發現面試都會問到設計模式中的單例模式,所以回家做了一個對於單例模式的總結,如有問題,請留言指教。
單例模式的簡介
單例模式:就是保證系統中只有一個執行個體,就叫單例模式(singleton pattern);
單例模式分為:餓漢式和懶漢式;
單例模式必須遵循的規則:
1. 該類,在整個系統中必須只能有一個執行個體;
2. 這個唯一的執行個體,必須類自行建立這個執行個體;
3. 必須自行向整個系統提供這個執行個體;
單例模式具體實現必須遵循的規則:
1. 定義一個靜態變數來儲存執行個體;
2. 定義一個私人的建構函式,阻止外界自己建立執行個體;
3. 定義一個靜態公有方法,提供一個全域的訪問點;
4. 考慮到安全執行緒時,需要定義一個標識,確保線程同步機制;
單例模式的典型的應用代碼:
餓漢式
餓漢式,不用考慮在使用者給執行個體賦值null時,出問題.因為每次進去都會執行個體化;
public class Singleton { private static Sinleton mySingleton=new Sinleton(); private Sinleton{} public static Sinleton GetIntance(){return mySinleton;}}View Code
懶漢式
public class Singleton{ private static Singleton mySingleton; private Singleton{} public static Singleton GetIntance(){ if(mySingleton==null){ return mySingleton=new Singleton();}return mySingleton;}}View Code
單例模式多線程情況
針對懶漢式,多線程下出現這種情況:比如兩線程A和B,A運行到if(mySingleton==null) 時,B運行到mySingleton=new Singleton();B雖然執行個體化了mySingleton,但是對於A還是沒有被執行個體化,A繼續會執行 mySingleton=new Singleton();這個時候就出現問題了 ,有兩個執行個體的問題;於是改編代碼
public class SingletonExample{ private static SingletonExample mySingleton;private static readonly object locker=new object();private SingletonExample{}//該公有存取方法,可以重載多參數的方法;public static SingletonExample GetInstance(){if(mySingleton==null){lock(locker){ mySingleton=new SingletonExample();}}return mySingleton;}}View Code
此時,A,B同時運行到lock(locker) ,這時只能一個線程訪問,於是B先執行,B獲得鎖,然後B執行完後,解鎖. A執行去,因為沒有判斷是否mySingleton==null,所以還是會執行個體化,出現兩個執行個體的情況;
於是雙重檢查模式(DCL)就出現了。代碼如下:
public class SingletonExample{
//此處是懶漢式; 未執行個體化 ,比較常用.
//餓漢式: private static SingletonExample mySingleton =new SingletonExample(); //已執行個體化 private static SingletonExample mySingleton;private static readonly object locker=new object();private SingletonExample(){}
//該公有存取方法,可以重載多參數的方法;public static SingletonExample GetInstance(){if(mySingleton==null){lock(locker){if(mySingleton==null){ mySingleton=new SingletonExample();}}}return mySingleton;}}
注意:
1.因為實現單例模式的這個實際是一個類,所以除了遵循了單例該有的規則,其他的欄位,屬性都和普通類一樣都可以存在;
關於單例模式的基礎學習就是以上,有問題,請留言互相討論;THX
設計模式之單例模式學習(C#)