Singleton模式的实现
1.實(shí)現(xiàn)Singleton模式
設(shè)計(jì)一個(gè)類(lèi),我們只能生成該類(lèi)的一個(gè)實(shí)例。
2.低級(jí)解法一:只適用于單線程環(huán)境
因?yàn)槲覀冎荒苌梢粋€(gè)實(shí)例,所以我們必須把構(gòu)造函數(shù)設(shè)置為私有函數(shù)已禁止他人創(chuàng)建實(shí)例。可以定義一個(gè)靜態(tài)的實(shí)例,在需要的時(shí)候創(chuàng)建該實(shí)例。
public sealed class Sinleton1 {private Singleton1() {}private static Singleton1 instance = null;public static Singleton1 instance{get{if(instance == null)instance = new Singleton1();return instance;}} }代碼中,Singleton的靜態(tài)屬性Instance中,只有在instance為null的時(shí)候才會(huì)創(chuàng)建一個(gè)實(shí)例避免重復(fù)創(chuàng)建。同時(shí)我們吧構(gòu)造函數(shù)定義為私有函數(shù),這樣就能確保只創(chuàng)建一個(gè)實(shí)例。
3.低級(jí)解法二:雖然在多線程環(huán)境中能運(yùn)行但是效率低下
2中的代碼在單線程中是可以工作的,但是再多線程的情況下就會(huì)出現(xiàn)問(wèn)題。假如兩個(gè)線程同時(shí)運(yùn)行到判斷 instance==null語(yǔ)句時(shí),并且這個(gè)時(shí)候instance確實(shí)沒(méi)有被創(chuàng)建,那么兩個(gè)線程都會(huì)創(chuàng)建一個(gè)instance,此時(shí)類(lèi)型Singleton就不滿足單例模式的要求了。為了保證多線程條件下,我們?nèi)阅苤坏玫筋?lèi)型的一個(gè)實(shí)例,需要加上一個(gè)同步鎖。代碼如下:
public sealed class Singleton2 {private Singleton2() {}private static readonly object syncObj = new object();private static Singleton2 instance = null;public static Singleton2 Instance{get{lock(syncObj){if(instance == null)instance = new Singleton2();}return instance;}} }由于一個(gè)時(shí)刻只有一個(gè)線程能得到同步鎖,當(dāng)?shù)谝粋€(gè)線程加上瑣事,第二個(gè)線程只能等待。當(dāng)?shù)匾粋€(gè)線程發(fā)現(xiàn)實(shí)例還沒(méi)有創(chuàng)建時(shí),他會(huì)創(chuàng)建一個(gè)實(shí)例。接著第一個(gè)線程釋放同步鎖,此時(shí)第二個(gè)線程可以加上同步鎖,并運(yùn)行接下來(lái)的代碼。這個(gè)時(shí)候由于實(shí)例已經(jīng)被第一個(gè)線程創(chuàng)建出來(lái)了,第二個(gè)線程就不會(huì)創(chuàng)建實(shí)例了。這就保證了我們?cè)诙嗑€程換金鐘只能得到一個(gè)實(shí)例。
然而我們不得不接受這樣的一個(gè)現(xiàn)實(shí),每次通過(guò)屬性Instance得到Singleton2的實(shí)例,都會(huì)試圖加上一個(gè)同步鎖,而加鎖是一個(gè)非常耗時(shí)的操作,在沒(méi)有必要的時(shí)候應(yīng)該避免。
4.高級(jí)解法一:嵌套類(lèi)
public sealed class Singleton3 {Singleton3() {}public static Singleton3 Instance{get{return Nested.instance;}}class Nested{static Nested() {}internal static readonly Singleton3 instance = new Singleton3();} } 內(nèi)部定義了一個(gè)私有類(lèi)型Nested,當(dāng)?shù)谝淮斡玫竭@個(gè)嵌套類(lèi)型的時(shí)候,就會(huì)調(diào)用靜態(tài)構(gòu)造函數(shù)Singleton3的實(shí)例instance。類(lèi)型Nested只在屬性Singleton3.instance中被用到,由于它是私有的,其他人無(wú)法使用Nested類(lèi)型。因此,當(dāng)我們第一次試圖通過(guò)屬性Singleton3Instance得到Singleton3的實(shí)例時(shí),會(huì)自動(dòng)調(diào)用Nested的靜態(tài)構(gòu)造函數(shù)創(chuàng)建實(shí)例instance。總結(jié)
以上是生活随笔為你收集整理的Singleton模式的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 个 人 简 历
- 下一篇: Visual Studio 调试器---