單例模式的好處:
單例模式的好處就是單例,就是全域唯一的一個實體,應對一些特殊情況,比如資料庫連接池(內置了資源)全域唯一奧瑪生成器,單例可以避免重復創建,但是也會常駐記憶體,除非真的有必要,否則不要用單例模式,
單例模式:
1、建構式私有化,避免別人還去new
2、公開的靜態方法提供物件實體
3、初始化一個靜態欄位用于回傳,保證全域都是這一個,
/// <summary>/// 單例類:一個構造物件很耗時耗資源型別/// 懶漢式單例模式/// </summary>public class Singleton{ /// <summary> /// 建構式耗時耗資源 /// </summary> private Singleton() { } /// <summary> /// 3 全域唯一靜態 重用這個變數 /// </summary> private static volatile Singleton _Singleton = null; /// <summary> /// 2 公開的靜態方法提供物件實體 /// </summary> /// <returns></returns> public static Singleton CreateInstance() { _Singleton = new Singleton(); return _Singleton; }}
可以用以object.ReferenceEquals來驗證創建的實體是不是同一個
Singleton singleton1 = Singleton.CreateInstance(); Singleton singleton2 = Singleton.CreateInstance(); Singleton singleton3 = Singleton.CreateInstance(); Console.WriteLine(object.ReferenceEquals(singleton1, singleton2)); Console.WriteLine(object.ReferenceEquals(singleton3, singleton2));
在多執行緒下,同事開啟5個執行緒去創建呢?
for (int i = 0; i < 5; i++) { Task.Run(() =>//啟動執行緒完成--5個執行緒并發執行,同時去執行這個方法 { Singleton singleton1 = Singleton.CreateInstance(); singleton1.Show(); }); }
這里就會出現多執行緒的問題,下面來解決多執行緒面臨的問題,
/// <summary>/// 單例類:一個構造物件很耗時耗資源型別/// 懶漢式單例模式/// </summary>public class Singleton{ /// <summary> /// 建構式耗時耗資源 /// </summary> private Singleton() { long lResult = 0; for (int i = 0; i < 10000000; i++) { lResult += i; } Thread.Sleep(2000); Console.WriteLine("{0}被構造一次", this.GetType().Name); } /// <summary> /// 3 全域唯一靜態 重用這個變數 /// </summary> private static volatile Singleton _Singleton = null; //volatile 促進執行緒安全 讓執行緒按順序操作 private static readonly object Singleton_Lock = new object(); /// <summary> /// 2 公開的靜態方法提供物件實體 /// </summary> /// <returns></returns> public static Singleton CreateInstance() { if (_Singleton == null)//是_Singleton已經被初始化之后,就不要進入鎖等待了 { lock (Singleton_Lock) //保證任意時刻只有一個執行緒進入lock范圍 //也限制了并發,尤其是_Singleton已經被初始化之后 { //Thread.Sleep(1000); //Console.WriteLine("等待鎖1s之后才繼續,,,"); if (_Singleton == null)//保證只實體化一次 { _Singleton = new Singleton(); } } } return _Singleton; } //既然是單例,大家用的是同一個物件,用的是同一個方法,那還會并發嗎 還有執行緒安全問題嗎? public int iTotal = 0; public void Show() { //lock (Singleton_Lock) //{ this.iTotal++; //} } public static void Test() { Console.WriteLine("Test1"); Console.WriteLine(_Singleton.iTotal); }}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/46480.html
標籤:設計模式
上一篇:設計模式
下一篇:設計模式-原型模式
