標籤:const only pre ons 沒有 全域 構造 c# 實現
1、非安全執行緒(傳統模式),但沒有考慮安全執行緒,在多線程時可能會出問題,不過還從沒看過出錯的現象。
/// <summary> /// 單例模式的實現 /// </summary> public class Singleton { // 定義一個靜態變數來儲存類的執行個體 private static Singleton uniqueInstance; // 定義私人建構函式,使外界不能建立該類執行個體 private Singleton() { } /// <summary> /// 定義公有方法提供一個全域訪問點,同時你也可以定義公有屬性來提供全域訪問點 /// </summary> /// <returns></returns> public static Singleton GetInstance() { // 如果類的執行個體不存在則建立,否則直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } return uniqueInstance; } }
2、嘗試安全執行緒(雙重鎖定)
/// <summary> /// 單例模式的實現 /// </summary> public class Singleton { // 定義一個靜態變數來儲存類的執行個體 private static Singleton uniqueInstance; // 定義一個標識確保線程同步 private static readonly object locker = new object(); // 定義私人建構函式,使外界不能建立該類執行個體 private Singleton() { } /// <summary> /// 定義公有方法提供一個全域訪問點,同時你也可以定義公有屬性來提供全域訪問點 /// </summary> /// <returns></returns> public static Singleton GetInstance() { // 當第一個線程運行到這裡時,此時會對locker對象 "加鎖", // 當第二個線程運行該方法時,首先檢測到locker對象為"加鎖"狀態,該線程就會掛起等待第一個線程解鎖 // lock語句運行完之後(即線程運行完之後)會對該對象"解鎖" // 雙重鎖定只需要一句判斷就可以了 if (uniqueInstance == null) { lock (locker) { // 如果類的執行個體不存在則建立,否則直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }
3、簡單安全線程
/// <summary> /// 單例模式的實現 /// </summary> public class Singleton { // 定義一個靜態變數來儲存類的執行個體 private static Singleton uniqueInstance; // 定義一個標識確保線程同步 private static readonly object locker = new object(); // 定義私人建構函式,使外界不能建立該類執行個體 private Singleton() { } /// <summary> /// 定義公有方法提供一個全域訪問點,同時你也可以定義公有屬性來提供全域訪問點 /// </summary> /// <returns></returns> public static Singleton GetInstance() { // 當第一個線程運行到這裡時,此時會對locker對象 "加鎖", // 當第二個線程運行該方法時,首先檢測到locker對象為"加鎖"狀態,該線程就會掛起等待第一個線程解鎖 // lock語句運行完之後(即線程運行完之後)會對該對象"解鎖" lock (locker) { // 如果類的執行個體不存在則建立,否則直接返回 if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } return uniqueInstance; } }
4、餓漢模式(這種模式的特點是自己主動執行個體。)
public sealed class Singleton{ private static readonly Singleton instance=new Singleton(); private Singleton() { } public static Singleton GetInstance() { return instance; }}
5、不完全lazy,但是安全執行緒且不用用鎖。
public sealed class Singleton{ private static readonly Singleton instance = new Singleton(); // 顯示的static 建構函式 //沒必要標記類型 - 在field初始化以前 static Singleton() { } private Singleton() { } public static Singleton Instance { get { return instance; } }}
6、完全延遲執行個體化
public sealed class Singleton{ private Singleton() { } public static Singleton Instance { get { return Nested.instance; } } private class Nested { // Explicit static constructor to tell C# compiler // not to mark type as beforefieldinit static Nested() { } internal static readonly Singleton instance = new Singleton(); }}
7、使用 .NET 4‘s Lazy<T> 類型
public sealed class Singleton{ private static readonly Lazy<Singleton> lazy = new Lazy<Singleton>(() => new Singleton()); public static Singleton Instance { get { return lazy.Value; } } private Singleton() { }}
C# 單例模式