1. 程式人生 > >C# 單執行緒和多執行緒下的單例模式的實現

C# 單執行緒和多執行緒下的單例模式的實現

該單例模式是執行緒不安全的,只能在單執行緒下執行,在多執行緒中如果被兩個執行緒同時呼叫Instance屬性時,此時兩個執行緒

判斷 if (_instance==null)時都會返回true,就會建立兩個例項。

public class Singleton{ /// <summary> /// 靜態變數(用來存放類的例項) /// </summary> static Singleton _instance; /// <summary> /// 靜態屬性(提供給外部的全域性訪問點) /// </summary> public static Singleton
Instance { get { if (_instance == null) { _instance = new Singleton(); } return _instance; } } /// <summary> /// 私有構造方法(防止被外部例項化) /// </summary> private Singleton() {
}}

下面這個單例是最常見的執行緒安全的,建立例項之前先進行鎖定操作,保證了只有一個執行緒可以訪問該語句塊,在鎖定操作之前先判斷是否已經建立了例項,只有當未建立例項的時候才會去進行鎖定操作,避免了頻繁的鎖定操作。

public class Singleton{ /// <summary> /// 靜態變數(用來存放類的例項) /// </summary> static Singleton _instance; /// <summary> /// 用來鎖定的物件 /// </summary> static readonly object locker = new object(); /// <summary> /// 靜態屬性(提供給外部的全域性訪問點) /// </summary> public static Singleton
Instance { get { //只有當第一次建立例項的時候再執行lock語句 if (_instance == null) { //當一個執行緒執行的時候,會先檢測locker物件是否是鎖定狀態, //如果不是則會對locker物件鎖定,如果是則該執行緒就會掛起等待 //locker物件解鎖,lock語句執行執行完之後會對該locker物件解鎖 lock (locker) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } } /// <summary> /// 私有構造方法(防止被外部例項化) /// </summary> private Singleton() {
}}

該單例使用的readonly關鍵字跟static一起使用,用於指定該常量是類別級的,它的初始化交由靜態建構函式實現,並可以在執行時編譯,在這種模式下,無需自己解決執行緒安全問題,CLR會給我們解決。

public class Singleton{ /// <summary> /// 靜態變數(用來存放類的例項) /// </summary> static readonly Singleton _instance=new Singleton();
/// <summary> /// 靜態屬性(提供給外部的全域性訪問點) /// </summary> public static Singleton Instance { get { return _instance; } } /// <summary> /// 私有構造方法(防止被外部例項化) /// </summary> private Singleton() {
}}