上述內容不是執行緒安全的。兩個不同的執行緒都可以評估測試public sealed class singleton
public static singleton instance
return instance;
} }
}
if (instance==null)
並發現它為true
,然後兩個都建立例項,這違反了單例模式。請注意,實際上,在計算表示式之前可能已經建立了例項,但是記憶體模型不保證其他執行緒可以看到例項的新值,除非已經傳遞了合適的記憶體屏障(互斥鎖)
此實現是執行緒安全的。執行緒取消對共享物件的鎖定,然後在建立例項之前檢查是否已建立例項。這會解決記憶體屏障問題(因為鎖定確保在獲取鎖之後邏輯上發生所有讀取,並且解鎖確保在鎖定釋放之前邏輯上發生所有寫入)並確保只有乙個執行緒將建立例項(僅限於一次只能有乙個執行緒可以在**的那一部分中——當第二個執行緒進入它時,第乙個執行緒將建立例項,因此表示式將計算為public sealed class singleton
public static singleton instance
return instance;}}
}}
false
)。不幸的是,每次請求例項時都會獲得鎖定,因此效能會受到影響。請注意,不是
typeof(singleton)
像這個實現的某些版本那樣鎖定,而是鎖定乙個私有的靜態變數的值。鎖定其他類可以訪問和鎖定的物件(例如型別)會導致效能問題甚至死鎖。這是我通常的風格偏好——只要有可能,只鎖定專門為鎖定目的而建立的物件,或者為了特定目的(例如,等待/觸發佇列)而鎖定的文件。通常這些物件應該是它們所使用的類的私有物件。這有助於使編寫執行緒安全的應用程式變得更加容易。
該實現嘗試是執行緒安全的,而不必每次都取出鎖。不幸的是,該模式有四個缺點:public sealed class singleton
public static singleton instance}}
return instance;}}
}
public sealed class singleton
private singleton()
public static singleton instance
}}
在這裡,例項化是由對巢狀類的靜態成員的第一次引用觸發的,該引用只發生在public sealed class singleton
public static singleton instance }
private class nested
internal static readonly singleton instance = new singleton();
}}
instance
中。這意味著實現是完全懶惰的,但是具有前面實現的所有效能優勢。請注意,儘管巢狀類可以訪問封閉類的私有成員,但反之則不然,因此需要instance
在此處為內部成員。不過,這不會引起任何其他問題,因為類本身是私有的。但是,為了使例項化變得懶惰,**要稍微複雜一些。
它很簡單,而且效能很好。它還允許您檢查是否已使用isvaluecreated 屬性建立例項(如果需要的話)。public sealed class singleton
} private singleton()
}
上面的**隱式地將
lazythreadsafetymode.executionandpublication
用作lazy
的執行緒安全模式。根據您的要求,您可能希望嘗試其他模式。
設計模式 C 設計模式 單例模式
設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 作者自用的泛型單例模組 單例模式 singleton pa...
C 設計模式 (單例模式)
單例模式 顧名思義,只有乙個物件例項,即保證乙個類只有乙個物件可以使用。作用類似於乙個全域性變數,可以任意呼叫,但是比全域性變數更容易管理,使用。單例模式也有很多種實現方式 第一種實現方法 h檔案 class csock test public casyncsocket cpp檔案 csock te...
設計模式 單例模式(c )
在gof 設計模式 中,單例模式的定義為 保證乙個類僅有乙個例項,並提供乙個該例項的全域性訪問點。下面是單例模式的c 實現 方案一 建構函式和拷貝建構函式一定要宣告為private 定義static成員 單例指標和獲取單例指標的函式 static單例指標要在類外定義並初始化 實現獲取單例指標的函式時...