C# 单例模式的多种简单实现
什么是單例模式?
這里我就不做過多的解釋了, 畢竟關(guān)于Singleton的資料實(shí)在是太多太多了。點(diǎn)擊這里
?
1.簡單的思路就是, 創(chuàng)建對(duì)象單例的動(dòng)作轉(zhuǎn)移到另外的行為上面, 利用一個(gè)行為去創(chuàng)建對(duì)象自身, 如下:?
public class Singleton{private static Singleton _Singleton = null;public static Singleton CreateInstance(){if (_Singleton == null){Console.WriteLine("被創(chuàng)建");_Singleton = new Singleton();}return _Singleton;}}
這樣寫看上去是沒有問題, 但是有沒有那種可能, 同時(shí)兩個(gè)動(dòng)作都判斷這個(gè)對(duì)象為空, 那么這個(gè)對(duì)象就會(huì)被創(chuàng)建2次?是的, 多線程中, 這樣是無法保證單例。
就像這樣, 同時(shí)創(chuàng)建多個(gè)線程去創(chuàng)建這個(gè)對(duì)象實(shí)例的時(shí)候, 會(huì)被多次創(chuàng)建, 這個(gè)時(shí)候, 對(duì)代碼改進(jìn)一下。
public class Singleton{private static Singleton _Singleton = null;private static object Singleton_Lock = new object(); //鎖同步public static Singleton CreateInstance(){lock (Singleton_Lock){Console.WriteLine("路過");if (_Singleton == null){
Console.WriteLine("被創(chuàng)建");_Singleton = new Singleton();}}return _Singleton;}}
調(diào)試代碼:
TaskFactory taskFactory = new TaskFactory();List<Task> taskList = new List<Task>();for (int i = 0; i < 5; i++){taskList.Add(taskFactory.StartNew(() =>{Singleton singleton = Singleton.CreateInstance(); }));}結(jié)果:
上面, 我們創(chuàng)建了多個(gè)線程,同時(shí)去創(chuàng)建這個(gè)對(duì)象的實(shí)例, 在第二次,對(duì)象命名已經(jīng)被創(chuàng)建了, 盡管只創(chuàng)建了一次滿足了我們的需求, 但是我們已知對(duì)象被創(chuàng)建了, 還需要進(jìn)來做不必要的動(dòng)作嗎?
我們都知道, 同步鎖為了達(dá)到預(yù)期的效果, 也是損耗了性能的, 那么下面的輸出, 很顯然是沒必要的動(dòng)作, 所以我們優(yōu)化一下。
public class Singleton{private static Singleton _Singleton = null;private static object Singleton_Lock = new object();public static Singleton CreateInstance(){if (_Singleton == null) //雙if +lock{lock (Singleton_Lock){Console.WriteLine("路過。");if (_Singleton == null){Console.WriteLine("被創(chuàng)建。");_Singleton = new Singleton();}}}return _Singleton;}}
結(jié)果:
很顯然, 這樣達(dá)到了我們的預(yù)期, 對(duì)象在被創(chuàng)建后, 就沒必要做多余的行為。
?
?
利用靜態(tài)變量實(shí)現(xiàn)單例模式
public class SingletonThird{/// <summary>/// 靜態(tài)變量/// </summary>private static SingletonThird _SingletonThird = new SingletonThird();public static SingletonThird CreateInstance(){return _SingletonThird;}}
是不是覺得很優(yōu)雅, 利用靜態(tài)變量去實(shí)現(xiàn)單例,? 由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次
?
PS: 但是他的缺點(diǎn)也很明顯, 在程序初始化后, 靜態(tài)對(duì)象就被CLR構(gòu)造了, 哪怕你沒用。
?
?
利用靜態(tài)構(gòu)造函數(shù)實(shí)現(xiàn)單例模式
?
public class SingletonSecond{private static SingletonSecond _SingletonSecond = null; static SingletonSecond(){_SingletonSecond = new SingletonSecond();}public static SingletonSecond CreateInstance(){return _SingletonSecond;}}
靜態(tài)構(gòu)造函數(shù):只能有一個(gè),無參數(shù)的,程序無法調(diào)用 。
同樣是由CLR保證,在程序第一次使用該類之前被調(diào)用,而且只調(diào)用一次
?
同靜態(tài)變量一樣, 它會(huì)隨著程序運(yùn)行, 就被實(shí)例化, 同靜態(tài)變量一個(gè)道理。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zh7791/p/7930342.html
總結(jié)
以上是生活随笔為你收集整理的C# 单例模式的多种简单实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7、Python文件操作工具 openp
- 下一篇: C#:导入Excel通用类(CSV格式)