什麼是單例模式:保證一個類只能有一個例項物件存在,並提供一個全域性的訪問點;
應用環境:只需要一個物件,一個例項的時候
例如:WinForm只能建立一個窗體的時候;只需要一個例項物件的時候
程式碼:
public class Singleton { //通過靜態的私有變數來判定是否類的例項化是否唯一 private static Singleton myInstancd; private Singleton() { } //定義全域性的方法提供類的外部訪問 public static Singleton GetInstance() { //如果為空則例項化物件,否則返回該物件 if(myInstancd==null) { myInstancd = new Singleton(); } return myInstancd; } }
缺點:在多執行緒的時候兩條執行緒同時訪問會都為空,會建立多個例項
解決辦法:加鎖
public class Singleton { //通過靜態的私有變數來判定是否類的例項化是否唯一 private static Singleton myInstancd; //判定是否加鎖保證執行緒同步 private static readonly object myLock = new object(); private Singleton() { } //定義全域性的方法提供類的外部訪問 public static Singleton GetInstance() { //lock加鎖的時候執行緒會掛起,不會出現多個例項物件 lock (myLock) { //如果為空則例項化物件,否則返回該物件 if (myInstancd == null) { myInstancd = new Singleton(); } } return myInstancd; } }