掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
學(xué)習(xí)C#語(yǔ)言時(shí),經(jīng)常會(huì)遇到C#調(diào)用instance()試圖問(wèn)題,這里將介紹C#調(diào)用instance()試圖問(wèn)題的解決方法。

首先去C#調(diào)用instance()試圖獲得類(lèi)的實(shí)例,instance()成員方法判斷該類(lèi)沒(méi)有創(chuàng)建***實(shí)例,于是開(kāi)始創(chuàng)建實(shí)例。由于一些因素,主線(xiàn)程不能馬上創(chuàng)建成功,而需要等待一些時(shí)間。此時(shí)線(xiàn)程1也去調(diào)用instance()試圖獲得該類(lèi)的實(shí)例,因?yàn)榇藭r(shí)實(shí)例還未被主線(xiàn)程成功創(chuàng)建,因此線(xiàn)程1又開(kāi)始創(chuàng)建新實(shí)例。結(jié)果是兩個(gè)線(xiàn)程分別創(chuàng)建了兩次實(shí)例,對(duì)于計(jì)數(shù)器類(lèi)來(lái)說(shuō),就會(huì)導(dǎo)致計(jì)數(shù)的值被重置,與Singleton的初衷違背。解決這個(gè)問(wèn)題的辦法是同步。
下面看看本文的計(jì)數(shù)器的例子的實(shí)現(xiàn):
使用方法一:
- using System;
- using System.Threading;
- namespace csPattern.Singleton
- {
- public class Counter
- {
- static Counter uniCounter = new Counter(); //存儲(chǔ)***的實(shí)例。
- private int totNum = 0; //存儲(chǔ)計(jì)數(shù)值。
- private Counter()
- {
- Thread.Sleep(100); //這里假設(shè)因?yàn)槟撤N因素而耽擱了100毫秒。
- //在非lazy initialization 的情況下, 不會(huì)影響到計(jì)數(shù)。.
- }
- static public Counter instance()
- {
- return uniCounter;
- }
- public void Inc() { totNum ++;} //計(jì)數(shù)加1。
- public int GetCounter() { return totNum;} //獲得當(dāng)前計(jì)數(shù)值。
- }
- }
方法一中由于實(shí)例一開(kāi)始就被創(chuàng)建,所以instance()方法無(wú)需再去判斷是否已經(jīng)存在***的實(shí)例,而返回該實(shí)例,所以不會(huì)出現(xiàn)計(jì)數(shù)器類(lèi)多次實(shí)例化的問(wèn)題。
使用方法二:
- using System;
- using System.Threading;
- using System.Runtime.CompilerServices;
- namespace csPattern.Singleton
- {
- public class Counter_lazy
- {
- static Counter_lazy uniCounter;
- private int totNum = 0;
- private Counter_lazy()
- {
- Thread.Sleep(100); //假設(shè)多線(xiàn)程的時(shí)候因某種原因阻塞100毫秒
- }
- [MethodImpl(MethodImplOptions.Synchronized)] //方法的同步屬性
- static public Counter_lazy instance()
- {
- if (null == uniCounter)
- {
- uniCounter = new Counter_lazy();
- }
- return uniCounter;
- }
- public void Inc() { totNum ++;}
- public int GetCounter() { return totNum;}
- }
- }
不知道大家有沒(méi)有注意到instance()方法上方的[MethodImpl(MethodImplOptions.Synchronized)] 語(yǔ)句,他就是同步的要點(diǎn),他指定了instance()方法同時(shí)只能被一個(gè)線(xiàn)程使用,這樣就避免了線(xiàn)程0調(diào)用instance()創(chuàng)建完成實(shí)例前線(xiàn)程1就來(lái)C#調(diào)用instance()試圖獲得該實(shí)例。
【編輯推薦】

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流