C#淺談單例模式
阿新 • • 發佈:2018-12-26
第一次寫部落格,寫的不好休怪哈。
版本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;
}
}
}
這種方法既保證了執行緒的安全,又減少了加鎖帶來的不必要的開銷。