第一次寫博客,寫的不好休怪哈。 版本1:最簡單的單例模式 方法一: 方法二: 兩點:1)保證所有構造函數不被外部所調用;2)利用屬性或者方法調用對象。 缺點:無法保證線程的安全性,多個線程的情況下可能創建多個對象。 版本2:線程安全的單例模式 缺點:無論對象是否已經被創建,都要進行加鎖,增加了不必要 ...
第一次寫博客,寫的不好休怪哈。
版本1:最簡單的單例模式
方法一:
public class MySingleton { private MySingleton() //構造函數,註意private { } private static MySingleton _Entity = null; //私有欄位 public static MySingleton Entity //公共屬性 { get { if (_Entity == null) //確保只能創建一次對象 { MySingleton._Entity = new MySingleton(); } return MySingleton._Entity; } } }
方法二:
public class MySingleton { private MySingleton() //構造函數,註意private { } private static MySingleton _Entity = null; //私有欄位 public static MySingleton GetEntity() //公有方法 { if (_Entity == null) //確保只能創建一次對象 { MySingleton._Entity = new MySingleton(); } return MySingleton._Entity; } }
兩點:1)保證所有構造函數不被外部所調用;2)利用屬性或者方法調用對象。
缺點:無法保證線程的安全性,多個線程的情況下可能創建多個對象。
版本2:線程安全的單例模式
public class MySingleton { private MySingleton() //構造函數,註意private { } private static readonly object obj = new object(); private static MySingleton _Entity = null; //私有欄位 public static MySingleton Entity //公共屬性 { get { lock (obj) //確保同一時刻,加鎖的代碼段只能被一個線程執行 { if (_Entity == null) //確保只能創建一次對象 { MySingleton._Entity = new MySingleton(); } } return MySingleton._Entity; } } }
缺點:無論對象是否已經被創建,都要進行加鎖,增加了不必要的開銷。
版本3:Double-Checked Locking
public class MySingleton { private MySingleton() //構造函數,註意private { } private static readonly object obj = new object(); private static MySingleton _Entity = null; //私有欄位 public static MySingleton Entity //公共屬性 { get { if (_Entity == null) //第一次檢驗,用於減少不必要的加鎖 { lock (obj) //確保同一時刻,加鎖的代碼段只能被一個線程執行 { if (_Entity == null) //第二次檢驗,確保只能創建一次對象 { MySingleton._Entity = new MySingleton(); } } } return MySingleton._Entity; } } }
這種方法既保證了線程的安全,又減少了加鎖帶來的不必要的開銷。