成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#線程同步技術(shù)之Monitor

開發(fā) 后端
本文繼續(xù)C#線程系列講座之五,即C#線程同步技術(shù)之Monitor 。

在上一講介紹了使用lock來實(shí)現(xiàn)線程之間的同步。實(shí)際上,這個(gè)lock是C#線程的一個(gè)障眼法,在C#編譯器編譯lock語(yǔ)句時(shí),將其編譯成了調(diào)用Monitor類。先看看下面的C#源代碼:

C#線程同步:Monitor

  1. public static void MyLock()  
  2. {  
  3.     lock (typeof(Program))  
  4.     {  
  5.     }  
  6. }  
  7.  

上面的代碼通過lock語(yǔ)句使MyLock同步,這個(gè)方法被編譯成IL后,代碼如圖1所示。

代碼如圖1 

 圖1

從上圖被標(biāo)注的區(qū)域可以看到,一條lock語(yǔ)句被編譯成了調(diào)用Monitor的Enter和Exit方法。Monitor在System.Threading命名空間中。lock的功能就相當(dāng)于直接調(diào)用Monitor的Entry方法,所不同的是,lock方法在結(jié)束后,會(huì)自動(dòng)解除鎖定,當(dāng)然,在IL中是調(diào)用了Monitor的Exit方法,但在C#程序中,看起來是自動(dòng)解鎖的,這類似于C#中的using語(yǔ)句,可以自動(dòng)釋放數(shù)據(jù)庫(kù)等的資源。但如果直接在C#源程序中使用Monitor類,就必須調(diào)用Exit方法來顯式地解除鎖定。如下面的代碼所示:

  1. Monitor.Entry(lockObj);  
  2. try 
  3. {  
  4.     // lockObj的同布區(qū)  
  5. }  
  6. catch(Exception e)  
  7. {  
  8.     // 異常處理代碼  
  9. }  
  10. finally 
  11. {  
  12.     Monitor.Exit(lockObj);  // 解除鎖定  
  13. }  
  14.  

Exit方法最后在finally里調(diào)用,這樣無(wú)論在方法在發(fā)生異常、返回還是正常執(zhí)行,都會(huì)執(zhí)行到finally,并調(diào)用Exit方法解除鎖定。

Monitor類不僅可以完全取代lock語(yǔ)句(如果只使用lock語(yǔ)句本身的功能,最好還是直接用lock語(yǔ)句吧),還可以使用TryEntry方法設(shè)置一個(gè)鎖定超時(shí),單位是毫秒。如下面的代碼所示:

C#線程同步:Monitor.TryEntry

  1. if(Monitor.TryEntry(lockObj, 1000))  
  2. {  
  3.     try 
  4.     {  
  5.     }  
  6.     finally 
  7.     {  
  8.         Monitor.Exit(lockObj);  
  9.     }  
  10. }  
  11. else 
  12. {  
  13.     // 超時(shí)后的處理代碼  
  14. }  
  15.  

上面的代碼設(shè)置了鎖定超時(shí)時(shí)間為1秒,也就是說,在1秒中后,lockObj還未被解鎖,TryEntry方法就會(huì)返回false,如果在1秒之內(nèi),lockObj被解鎖,TryEntry返回true。我們可以使用這種方法來避免死鎖,如下面的代碼所示:

  1. class Program  
  2. {  
  3.     private static Object objA = new Object();  
  4.     private static Object objB = new Object();  
  5.     public static void LockA()  
  6.     {  
  7.         if (Monitor.TryEnter(objA, 1000))  
  8.         {  
  9.             Thread.Sleep(1000);  
  10.             if (Monitor.TryEnter(objB, 2000))  
  11.             {  
  12.                 Monitor.Exit(objB);  
  13.             }  
  14.             else 
  15.             {  
  16.  
  17.                 Console.WriteLine("LockB timeout");  
  18.             }  
  19.             Monitor.Exit(objA);  
  20.         }  
  21.         Console.WriteLine("LockA");  
  22.     }  
  23.     public static void LockB()  
  24.     {  
  25.         if (Monitor.TryEnter(objB, 2000))  
  26.         {  
  27.             Thread.Sleep(2000);  
  28.             if (Monitor.TryEnter(objA, 1000))  
  29.             {  
  30.                 Monitor.Exit(objA);  
  31.             }  
  32.             else 
  33.             {  
  34.                 Console.WriteLine("LockA timeout");  
  35.             }  
  36.             Monitor.Exit(objB);  
  37.         }  
  38.         Console.WriteLine("LockB");  
  39.     }  
  40.     public static void Main()  
  41.     {  
  42.         Thread threadA = new Thread(LockA);  
  43.         Thread threadB = new Thread(LockB);  
  44.         threadA.Start();  
  45.         threadB.Start();  
  46.         Thread.Sleep(4000);           
  47.         Console.WriteLine("線程結(jié)束");  
  48.     }  
  49. }  

上面的代碼是在上一講舉的死鎖的例子,但在這一講將lock語(yǔ)句改成了TryEntry方法,而且設(shè)置了鎖定超時(shí)間,由于在等待一定時(shí)間后,不管被鎖定的對(duì)象是否被解鎖,TryEntry方法都會(huì)返回,因此,上面的代碼是不會(huì)死鎖的。運(yùn)行上面的代碼的結(jié)果如圖2所示。

代碼的結(jié)果如圖2 

 圖2

如果TryEntry方法的超時(shí)時(shí)間為System.Threading.Timeout.Infinite,TryEntry方法就相當(dāng)于Entry方法,如果超時(shí)時(shí)間為0,不管是否解鎖,TryEntry方法都會(huì)立即返回。

以上就是C#線程同步技術(shù)Monitor的使用,希望對(duì)大家有所幫助。

【編輯推薦】

  1. C#自定義特性介紹
  2. C#內(nèi)置特性介紹
  3. 如何進(jìn)行C#異常類的自定義
  4. C#編程技巧七條
  5. 預(yù)測(cè)C#與.NET的發(fā)展趨勢(shì)
責(zé)任編輯:book05 來源: csdn
相關(guān)推薦

2025-02-17 02:00:00

Monitor機(jī)制代碼

2009-08-04 17:57:41

C#線程同步死鎖

2009-09-04 14:41:09

C#同步線程

2009-08-13 13:31:13

鎖定對(duì)象C# Monitor類

2009-09-07 13:19:44

C#線程同步

2024-02-27 10:44:58

C#線程后端

2011-08-30 15:44:57

C#

2021-09-09 07:16:00

C#多線程開發(fā)

2010-12-21 14:21:36

線程C#

2009-08-25 17:59:49

C#入門

2024-10-07 08:37:32

線程池C#管理機(jī)制

2009-08-25 15:09:30

C#線程的啟動(dòng)

2009-08-18 09:26:07

C#線程功能

2009-08-12 16:22:29

C#插件技術(shù)

2021-03-15 08:18:23

C#反射模塊

2009-08-25 16:32:24

C#語(yǔ)言

2009-08-28 16:51:32

C#線程控制

2009-09-07 13:02:52

Java和C#線程

2009-08-18 09:33:49

C#特有線程功能

2009-08-12 18:04:44

編寫C#多線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 99中文字幕 | 亚洲成av人片在线观看无码 | 国产成人精品免高潮在线观看 | 亚洲免费在线 | 欧美夜夜 | 99久久婷婷国产综合精品电影 | 久久久视频在线 | 日本午夜精品一区二区三区 | 欧美国产精品一区二区三区 | 高清亚洲| 久草视频在线播放 | 精品国产乱码久久久久久88av | 91在线免费视频 | 国产1区| 日韩一级 | 亚洲国产免费 | 99久久精品国产一区二区三区 | 91精品综合久久久久久五月天 | 欧美精品在线播放 | 九九热精品免费 | 亚洲导航深夜福利涩涩屋 | 中文字幕男人的天堂 | 国产精品美女久久久av超清 | 国产成人免费 | 精品av| 九九成人| 在线看一区二区三区 | 日本成人免费网站 | 中文字幕第三页 | 天天爽天天干 | 国产激情一区二区三区 | 欧美性网站 | 日本午夜在线视频 | 欧美精品1区 | 国产亚洲一区二区三区 | 午夜男人的天堂 | 中文久久| 国产精品久久久久免费 | 亚洲精品1| 国产一区二区久久 | 欧美精品1区 |