單例模式屬於設計模式中最簡單的一個模式,在實際應用中也很是普遍,但多是受到各種教程的影響,看到不少實現方式仍然沿用Java的那一套,其實在.NET中能夠用更簡潔的實現方式。設計模式
1、知識點介紹安全
核心目標:爲了項目各處調用的都是同一個實例對象,從而實現資源共享。例如環境變量。多線程
常見的實現方式:餓漢模式、懶漢模式、雙鎖模式ui
2、實現方式spa
/// <summary> /// 餓漢模式,每次都加載會形成資源浪費 /// </summary> public class EagerSingleton { public static Demo Instance { get; } = new Demo(); }
/// <summary> /// 懶漢模式,適用於沒有多線程的簡單應用 /// </summary> public class LazySingleton { private static Demo _instance = null; public static Demo Instance { get { if (_instance == null) _instance = new Demo(); return _instance; } } }
/// <summary> /// 線程安全 /// </summary> public class ThreadSafeSingleton { private static Demo _instance = null; private static readonly object _lock = new object(); public static Demo Instance { get { if (_instance == null) { lock (_lock) { if (_instance == null) _instance = new Demo(); } } return _instance; } } }
調用方式線程
static void Main(string[] args) { ThreadPool.SetMaxThreads(25, 25);// 調整最大線程數 ThreadPool.SetMinThreads(10, 10);// 調整最小線程數 Console.WriteLine("========== 示例:餓漢模式的多線程 =========="); Parallel.For(0, 10, (i) => { Console.WriteLine($"{EagerSingleton.Instance.Id} "); }); Console.WriteLine(); Console.WriteLine("========== 示例:懶漢模式的多線程 =========="); Parallel.For(0, 10, (i) => { Console.WriteLine($"{LazySingleton.Instance.Id} "); }); Console.WriteLine(); Console.WriteLine("========== 示例:線程安全模式的多線程 =========="); Parallel.For(0, 10, (i) => { Console.WriteLine($"{ThreadSafeSingleton.Instance.Id} "); }); Console.ReadKey(); } public class Demo { public string Id { get; private set; } public Demo() { Id = Guid.NewGuid().ToString(); } }
調用結果:設計
3、結論code
> 餓漢模式適用於規模不大又涉及多線程的應用,可是要關注單例的對象的資源佔用狀況。對象
> 懶漢模式適用於不須要多線程的應用,容易理解記住而且效果還不錯。blog
> 雙鎖模式就適用於比較規範化的應用,適用於有長遠規劃的系統。
> 單例模式不要實現 ICloneable 接口,不要涉及序列化,不然就會出現多個對象。