




已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
一、引入單例模式作為23種設(shè)計(jì)模式中的最基礎(chǔ)的一種模式,在平時(shí)開發(fā)中應(yīng)用也非常普遍。到底哪些類應(yīng)該設(shè)計(jì)成單例的呢,我們來(lái)舉個(gè)最通俗的例子。在一個(gè)父容器中單擊某個(gè)菜單項(xiàng)打開一個(gè)子窗口,如果不使用單例又沒(méi)有作菜單項(xiàng)的可用控制的話,每次單擊菜單項(xiàng)都會(huì)打開一個(gè)新窗口。這不僅會(huì)浪費(fèi)內(nèi)存資源,在程序邏輯上也是不可以接受的。二、最簡(jiǎn)單的單例下面來(lái)看一個(gè)最簡(jiǎn)單的單例模式的構(gòu)造形式 public class Program private static void Main(string args) GetInstance(); Console.ReadLine(); private void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private Singleton() public static Singleton getInstance() if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 這里通過(guò)幾個(gè)關(guān)鍵的地方以保證返回唯一的實(shí)例:1. 私有的構(gòu)造器,防止客戶端用new關(guān)鍵字去創(chuàng)建實(shí)例對(duì)象 2. 靜態(tài)的instance對(duì)象,保證全局唯一性 3. 對(duì)外的公共的靜態(tài)實(shí)例方法,從類級(jí)別直接可調(diào)用此方法 4. 通過(guò)判斷null值,決定是創(chuàng)建新實(shí)例還是直接返回。 三、并發(fā)下的單例不過(guò),以上標(biāo)準(zhǔn)的單例構(gòu)造模式在多并發(fā)的情況下就有可能失效,請(qǐng)參考下面的這種情況。 private static void Main(string args) /開啟10個(gè)線程來(lái)模擬多并發(fā)的情況 for (int i = 0; i 10; i+) Thread thread = new Thread(new ThreadStart(GetInstance); thread.Start(); Console.ReadLine(); private static void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private Singleton() public static Singleton getInstance() /讓線程睡一會(huì),來(lái)模擬有多個(gè)進(jìn)程都已經(jīng)在調(diào)用getInstance方法 Thread.Sleep(10); if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 以上的程序中開啟了10個(gè)線程,來(lái)模擬多個(gè)用戶同時(shí)訪問(wèn)getInstance方法。在getInstance方法里,開始先讓線程睡一會(huì),以模擬多個(gè)線程都已經(jīng)進(jìn)入了該方法。從運(yùn)行的結(jié)果看上,基本上不能保證實(shí)例化唯一的實(shí)例了。產(chǎn)生這種問(wèn)題的原因就是,當(dāng)一個(gè)線程進(jìn)入getInstance 方法,通過(guò)了 instance=null 的條件,還沒(méi)有來(lái)的及執(zhí)行 instance = new Singleton() 時(shí),另一個(gè)線程也通過(guò)了條件判斷,這時(shí)就會(huì) new Singleton() 多次了。解決的辦法就是加鎖,只讓一個(gè)線程進(jìn)來(lái),參考以下代碼: public class Program private static void Main(string args) /開啟100個(gè)線程來(lái)模擬多并發(fā)的情況 for (int i = 0; i 100; i+) Thread thread = new Thread(new ThreadStart(GetInstance); thread.Start(); Console.ReadLine(); private static void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private static readonly object objForLock=new object(); private Singleton() public static Singleton getInstance() /讓線程睡一會(huì),來(lái)模擬有多個(gè)進(jìn)程都已經(jīng)在調(diào)用getInstance方法 Thread.Sleep(10); /加一道鎖只讓一個(gè)線程進(jìn)來(lái) lock (objForLock) if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 這樣差不多可以達(dá)到我們的要求,只有一個(gè)實(shí)例對(duì)象存在可以保證了,但是這樣會(huì)帶來(lái)一點(diǎn)性能問(wèn)題。如果每個(gè)線程進(jìn)入getInstance方法后,都要lock一下以進(jìn)行線程同步的話,每個(gè)線程到這里都要等待解鎖后才能進(jìn)入,但是如果 instance已經(jīng)不是null了,那就應(yīng)該直接返回而不是等待解鎖,所以這里需要引入“雙重鎖”的單例構(gòu)造方法,代碼如下: private static void Main(string args) /開啟100個(gè)線程來(lái)模擬多并發(fā)的情況 for (int i = 0; i 100; i+) Thread thread = new Thread(new ThreadStart(GetInstance); thread.Start(); Console.ReadLine(); private static void GetInstance() Singleton objectSingleton = Singleton.getInstance(); public class Singleton private static Singleton instance = null; private static readonly object objForLock=new object(); private Singleton() public static Singleton getInstance() /讓線程睡一會(huì),來(lái)模擬有多個(gè)進(jìn)程都已經(jīng)在調(diào)用getInstance方法 Thread.Sleep(10); /先判斷是不是已經(jīng)實(shí)例化過(guò)了,避免進(jìn)入鎖等待狀態(tài) if(instance =null) /加一道鎖只讓一個(gè)線程進(jìn)來(lái) lock (objForLock) if (instance = null) instance = new Singleton(); Console.WriteLine(Create a singleton instance!); return instance; 四、“懶漢式”單例與“餓漢式”單例的比較所謂的“懶漢式”與“餓漢式”,就是實(shí)例對(duì)象的初始化時(shí)間不同:1.在需要實(shí)例化的時(shí)候才進(jìn)行實(shí)例化,就是懶漢式。我們上面的這些例子都是懶漢式的。懶漢式有好處當(dāng)然是節(jié)省資源啦,需要的時(shí)候才去構(gòu)造,平時(shí)不用占用內(nèi)存。不過(guò),這會(huì)帶來(lái)上面提到的在多并發(fā)下需要加鎖限制訪問(wèn)的問(wèn)題。2.類加載時(shí)就直接進(jìn)行實(shí)例化,就是餓漢式。例如下面的代碼: private static Singleton instance = new Singleton(); private Singleton() public static Singleton getInstance() return instance; 餓漢式單例是當(dāng)類第一次被加載時(shí)就會(huì)將instance進(jìn)行實(shí)例
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 山東省示范中學(xué)2025屆高三3月份第一次模擬考試英語(yǔ)試卷含解析
- 2025屆湖北省省實(shí)驗(yàn)中學(xué)高考英語(yǔ)考前最后一卷預(yù)測(cè)卷含答案
- 海底隧道工程中的隧道通風(fēng)策略考核試卷
- 磨制谷物在農(nóng)業(yè)與食品安全監(jiān)管協(xié)同中的作用考核試卷
- 綠色能源利用與環(huán)保意識(shí)考核試卷
- 液體乳品加工過(guò)程中的質(zhì)量檢驗(yàn)方法考核試卷
- 羽絨被絎縫工藝培訓(xùn)考核試卷
- 玩具行業(yè)的國(guó)際標(biāo)準(zhǔn)與全球市場(chǎng)準(zhǔn)入考核試卷
- 江蘇省泰興市振宇外國(guó)語(yǔ)校2025屆初三下學(xué)期考前沖刺(三)生物試題試卷含解析
- 遼寧工程技術(shù)大學(xué)《體育舞蹈專項(xiàng)理論與實(shí)踐A》2023-2024學(xué)年第二學(xué)期期末試卷
- JJF 2216-2025電磁流量計(jì)在線校準(zhǔn)規(guī)范
- 2025年中考數(shù)學(xué)一輪專題復(fù)習(xí)(廣東)27講-與圓有關(guān)的計(jì)算【課件】
- 2025屆湖南省高三下學(xué)期高考普通高中名校聯(lián)考第一次模擬考試生物試題(含解析)
- 2025年工程測(cè)量員(初級(jí))職業(yè)技能鑒定參考試題(附答案)
- 物業(yè)項(xiàng)目經(jīng)理考題及答案
- 電力建設(shè)工程概算定額電氣設(shè)備安裝工程(2018年版)
- 老年康體指導(dǎo)職業(yè)教育68課件
- 2025年中考?xì)v史總復(fù)習(xí)-講練測(cè)-主題15 ??键c(diǎn)一句話背記(中國(guó)近現(xiàn)代史)
- 2025年巴中發(fā)展控股集團(tuán)限公司招聘高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 機(jī)械精度設(shè)計(jì)基礎(chǔ) 課件 第六章 典型零件精度設(shè)計(jì)與檢測(cè)-3-螺紋
- 宏觀經(jīng)濟(jì)學(xué)知到智慧樹章節(jié)測(cè)試課后答案2024年秋浙江大學(xué)
評(píng)論
0/150
提交評(píng)論