標籤:
一、單例模式
目的:建立唯一執行個體
class Singleton{ private static Singleton instance; //私人靜態類變數 //主動建立私人的構造方法,這樣就堵死了外界利用new建立此類執行個體的可能 private Singleton() { } //此方法是獲得本類執行個體的唯一全域訪問點 pulic static Singleton GetInstance() { if(instance==null) { instance=new Singleton(); } return instance; }}
二、多線程時的單例
lock確保當一個縣城位於代碼的臨界區時,另一個線程不進入臨界區。如果其他線程試圖進入鎖定的代碼,則他將一直等待,直到對象被釋放。
class Singleton{ private static Singleton instance; private static readonly Object syncRoot=new Object(); //程式運行時建立一個靜態唯讀進程輔助對象 private Singleton() { } pulic static Singleton GetInstance() { lock(syncRoot) //在同一時刻加了鎖的那部分代碼只有一個線程可以進入 { if(instance==null) { instance=new Singleton(); } } return instance; }}
三、雙重鎖定
class Singleton{ private static Singleton instance; private static readonly Object syncRoot=new Object(); private Singleton() { } pulic static Singleton GetInstance() { if(instance==null) //先判斷執行個體是否存在,不存在再加鎖處理 { lock(syncRoot) { if(instance==null) { instance=new Singleton(); } } } return instance; }
對於instance存在的情況,就直接返回。當instance為null並且同時又兩個線程調用GetInstance()方法時,他們將都可以通過第一重instance==null的判斷。然後由於lock機制,這連個線程則只有一個進入,另一個在外排隊等候,必須要其中的一個進入並出來後,另一個才能進入。而此時如果沒有了第二重的instance是否為null的判斷,則第一個線程建立了執行個體,而第二個線程還是可以繼續再建立新的執行個體,這就沒有達到單例的目的。
單例模式