日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#調(diào)用instance()試圖

學(xué)習(xí)C#語言時,經(jīng)常會遇到C#調(diào)用instance()試圖問題,這里將介紹C#調(diào)用instance()試圖問題的解決方法。

首先去C#調(diào)用instance()試圖獲得類的實例,instance()成員方法判斷該類沒有創(chuàng)建***實例,于是開始創(chuàng)建實例。由于一些因素,主線程不能馬上創(chuàng)建成功,而需要等待一些時間。此時線程1也去調(diào)用instance()試圖獲得該類的實例,因為此時實例還未被主線程成功創(chuàng)建,因此線程1又開始創(chuàng)建新實例。結(jié)果是兩個線程分別創(chuàng)建了兩次實例,對于計數(shù)器類來說,就會導(dǎo)致計數(shù)的值被重置,與Singleton的初衷違背。解決這個問題的辦法是同步。

下面看看本文的計數(shù)器的例子的實現(xiàn):

使用方法一:

 
 
 
  1. using System;  
  2. using System.Threading;  
  3. namespace csPattern.Singleton  
  4. {  
  5. public class Counter  
  6. {  
  7. static Counter uniCounter = new Counter(); //存儲***的實例。  
  8. private int totNum = 0; //存儲計數(shù)值。  
  9. private Counter()  
  10. {  
  11. Thread.Sleep(100); //這里假設(shè)因為某種因素而耽擱了100毫秒。  
  12. //在非lazy initialization 的情況下, 不會影響到計數(shù)。.  
  13. }  
  14. static public Counter instance()  
  15. {  
  16. return uniCounter;  
  17. }  
  18. public void Inc() { totNum ++;} //計數(shù)加1。  
  19. public int GetCounter() { return totNum;} //獲得當(dāng)前計數(shù)值。  
  20. }  
  21. }  

方法一中由于實例一開始就被創(chuàng)建,所以instance()方法無需再去判斷是否已經(jīng)存在***的實例,而返回該實例,所以不會出現(xiàn)計數(shù)器類多次實例化的問題。

使用方法二:

 
 
 
  1. using System;  
  2. using System.Threading;  
  3. using System.Runtime.CompilerServices;  
  4. namespace csPattern.Singleton  
  5. {  
  6. public class Counter_lazy  
  7. {  
  8. static Counter_lazy uniCounter;  
  9. private int totNum = 0;  
  10. private Counter_lazy()  
  11. {  
  12. Thread.Sleep(100); //假設(shè)多線程的時候因某種原因阻塞100毫秒  
  13. }  
  14. [MethodImpl(MethodImplOptions.Synchronized)] //方法的同步屬性  
  15. static public Counter_lazy instance()  
  16. {  
  17. if (null == uniCounter)  
  18. {  
  19. uniCounter = new Counter_lazy();  
  20. }  
  21. return uniCounter;  
  22. }  
  23. public void Inc() { totNum ++;}  
  24. public int GetCounter() { return totNum;}  
  25. }  
  26. }  

不知道大家有沒有注意到instance()方法上方的[MethodImpl(MethodImplOptions.Synchronized)] 語句,他就是同步的要點,他指定了instance()方法同時只能被一個線程使用,這樣就避免了線程0調(diào)用instance()創(chuàng)建完成實例前線程1就來C#調(diào)用instance()試圖獲得該實例。

【編輯推薦】

  1. C#窗體里調(diào)用淺談
  2. C#調(diào)用ListEmployee命令
  3. C# CreateEmployeeDefinition()函數(shù)
  4. C#實現(xiàn)斷點續(xù)傳詳細(xì)剖析
  5. C# Employee對象淺談

網(wǎng)站欄目:C#調(diào)用instance()試圖
鏈接地址:http://www.dlmjj.cn/article/djeosoe.html