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

C# Monitor類鎖定對象

開發 后端
本文介紹C# Monitor類可以鎖定對象,一個線程只有得到這把鎖才可以對該對象進行操作。對象鎖機制保證了在可能引起混亂的情況下一個時刻只有一個線程可以訪問這個對象。

C# Monitor類鎖定對象

當多線程公用一個對象時,也會出現和公用代碼類似的問題,這種問題就不應該使用lock關鍵字了,這里需要用到System.Threading中的一個類Monitor,我們可以稱之為監視器,Monitor提供了使線程共享資源的方案。

C# Monitor類可以鎖定對象,一個線程只有得到這把鎖才可以對該對象進行操作。對象鎖機制保證了在可能引起混亂的情況下一個時刻只有一個線程可以訪問這個對象。

Monitor必須和一個具體的對象相關聯,但是由于它是一個靜態的類,所以不能使用它來定義對象,而且它的所有方法都是靜態的,不能使用對象來引用。下面代碼說明了使用Monitor鎖定對象的情形:

  1. ……  
  2. QueueoQueue=newQueue();  
  3. ……  
  4. Monitor.Enter(oQueue);  
  5. ……  
  6. //現在oQueue對象只能被當前線程操縱了Monitor.Exit(oQueue);  
  7. //釋放鎖 

如上所示,當一個線程調用Monitor.Enter()方法鎖定對象時,這個對象就歸它所有了,其它線程想要訪問這個對象,只有等待它使用Monitor.Exit()方法釋放鎖。為了保證線程最終都能釋放鎖,你可以把Monitor.Exit()方法寫在try-catch-finally結構中的finally代碼塊里。

對于任何一個被Monitor鎖定對象,內存中都保存著與它相關的一些信息:其一是現在持有鎖的線程的引用;其二是一個預備隊列,隊列中保存了已經準備好獲取鎖的線程;其三是一個等待隊列,隊列中保存著當前正在等待這個對象狀態改變的隊列的引用。

當擁有對象鎖的線程準備釋放鎖時,它使用Monitor.Pulse()方法通知等待隊列中的***個線程,于是該線程被轉移到預備隊列中,當對象鎖被釋放時,在預備隊列中的線程可以立即獲得對象鎖。

下面是一個展示如何使用lock關鍵字和C# Monitor類來實現線程的同步和通訊的例子,也是一個典型的生產者與消費者問題。

這個例程中,生產者線程和消費者線程是交替進行的,生產者寫入一個數,消費者立即讀取并且顯示(注釋中介紹了該程序的精要所在)。

用到的系統命名空間如下:using System;using System.Threading;

首先,定義一個被操作的對象的類Cell,在這個類里,有兩個方法:ReadFromCell()和WriteToCell.消費者線程將調用 ReadFromCell()讀取cellContents的內容并且顯示出來,生產者進程將調用WriteToCell()方法向 cellContents寫入數據。

示例如下:

  1.  public class Cell  
  2. {  
  3. int cellContents; // Cell對象里邊的內容  
  4. bool readerFlag = false;   
  5. // 狀態標志,為true時可以讀取,為false則正在寫入  
  6. public int ReadFromCell( )  
  7. {  
  8. lock(this) // Lock關鍵字保證了什么,請大家看前面對lock的介紹  
  9. {  
  10. if (!readerFlag)//如果現在不可讀取  
  11. {  
  12. try  
  13. {  
  14. //等待WriteToCell方法中調用Monitor.Pulse()方法  
  15. Monitor.Wait(this);  
  16. }  
  17. catch (SynchronizationLockException e)  
  18. {  
  19. Console.WriteLine(e);  
  20. }  
  21. catch (ThreadInterruptedException e)  
  22. {  
  23. Console.WriteLine(e);  
  24. }  
  25. }  
  26. Console.WriteLine("Consume: {0}",cellContents);  
  27. readerFlag = false;  
  28. //重置readerFlag標志,表示消費行為已經完成  
  29. Monitor.Pulse(this);  
  30. //通知WriteToCell()方法(該方法在另外一個線程中執行,等待中)  
  31. }  
  32. return cellContents;  
  33. }  
  34.    
  35. public void WriteToCell(int n)  
  36. {  
  37. lock(this)  
  38. {  
  39. if (readerFlag)  
  40. {  
  41. try  
  42. {  
  43. Monitor.Wait(this);  
  44. }  
  45. catch (SynchronizationLockException e)  
  46. {  
  47. //當同步方法(指Monitor類除Enter之外的方法)在非同步的代碼區被調用  
  48. Console.WriteLine(e);  
  49. }  
  50. catch (ThreadInterruptedException e)  
  51. {  
  52. //當線程在等待狀態的時候中止  
  53. Console.WriteLine(e);  
  54. }  
  55. }  
  56. cellContents = n;  
  57. Console.WriteLine("Produce: {0}",cellContents);  
  58. readerFlag = true;  
  59. Monitor.Pulse(this);  
  60. //通知另外一個線程中正在等待的ReadFromCell()方法  
  61. }  
  62. }  

【編輯推薦】

  1. C#結構體的特點淺析
  2. 介紹C#窗體拖動事件
  3. C#讀取Excel遇到無法讀取的解決方法
  4. 概述C#.NET操作XML
  5. C#基礎概念學習筆記
責任編輯:佚名 來源: IT168
相關推薦

2009-08-18 12:23:38

2009-08-04 18:00:51

C#線程同步Monitor

2009-08-20 17:13:37

C# FileSyst

2009-08-28 16:50:25

C# PromptPo

2009-08-25 16:03:51

C# SQLDMO對象

2009-08-31 09:44:23

C# Employee

2009-08-26 10:34:59

C# Hashtabl

2009-09-02 15:41:21

C# HTTPWebR

2009-08-12 11:24:25

C# String對象

2009-08-31 09:37:09

C# Employee

2009-08-25 10:08:39

C# MyData對象

2009-08-19 17:12:18

C# Connecti

2009-08-25 09:49:09

C#內存Graphic

2009-09-07 14:29:52

C# ServiceC

2009-08-06 14:43:10

C# Calculat

2009-08-21 17:24:06

C# SingleIn

2012-03-14 10:48:05

C#

2009-08-26 17:05:23

C# ThreadPo

2009-09-03 10:42:16

C# Employee

2009-09-03 15:57:11

C# SystemMe
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品综合久久久久久五月天 | 中文字幕av一区 | 国产精品久久av | 亚洲一级毛片 | 欧美精品片 | 亚洲精品乱码久久久久久蜜桃91 | 久久久久国产精品一区二区 | 97色在线观看免费视频 | 欧美激情在线观看一区二区三区 | 久久精品久久久久久 | 国产资源在线播放 | 欧美久| 99在线免费观看视频 | 国产欧美一区二区精品忘忧草 | 国产精品久久久久久久久久妞妞 | 天天操综合网 | 欧美一区二区三区在线免费观看 | 日韩精品一区二区三区第95 | 久久机热| 国产精品亚洲一区 | 日韩在线免费视频 | 精品久久久久一区二区国产 | 成人一区av偷拍 | 成年人在线视频 | 中文字幕视频在线 | 国产专区在线 | 久久99精品久久久久久国产越南 | 欧美激情精品久久久久久免费 | 亚洲人成一区二区三区性色 | 国产区在线看 | 99久久成人 | 人人看人人草 | 在线黄色影院 | 日韩视频在线播放 | 中文字幕亚洲欧美日韩在线不卡 | 成人免费视频 | 免费国产一区 | 99亚洲精品 | av看片| 亚洲自拍偷拍欧美 | 午夜三级在线观看 |