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

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

開(kāi)發(fā) 后端
本文介紹C# Monitor類可以鎖定對(duì)象,一個(gè)線程只有得到這把鎖才可以對(duì)該對(duì)象進(jìn)行操作。對(duì)象鎖機(jī)制保證了在可能引起混亂的情況下一個(gè)時(shí)刻只有一個(gè)線程可以訪問(wèn)這個(gè)對(duì)象。

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

當(dāng)多線程公用一個(gè)對(duì)象時(shí),也會(huì)出現(xiàn)和公用代碼類似的問(wèn)題,這種問(wèn)題就不應(yīng)該使用lock關(guān)鍵字了,這里需要用到System.Threading中的一個(gè)類Monitor,我們可以稱之為監(jiān)視器,Monitor提供了使線程共享資源的方案。

C# Monitor類可以鎖定對(duì)象,一個(gè)線程只有得到這把鎖才可以對(duì)該對(duì)象進(jìn)行操作。對(duì)象鎖機(jī)制保證了在可能引起混亂的情況下一個(gè)時(shí)刻只有一個(gè)線程可以訪問(wèn)這個(gè)對(duì)象。

Monitor必須和一個(gè)具體的對(duì)象相關(guān)聯(lián),但是由于它是一個(gè)靜態(tài)的類,所以不能使用它來(lái)定義對(duì)象,而且它的所有方法都是靜態(tài)的,不能使用對(duì)象來(lái)引用。下面代碼說(shuō)明了使用Monitor鎖定對(duì)象的情形:

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

如上所示,當(dāng)一個(gè)線程調(diào)用Monitor.Enter()方法鎖定對(duì)象時(shí),這個(gè)對(duì)象就歸它所有了,其它線程想要訪問(wèn)這個(gè)對(duì)象,只有等待它使用Monitor.Exit()方法釋放鎖。為了保證線程最終都能釋放鎖,你可以把Monitor.Exit()方法寫(xiě)在try-catch-finally結(jié)構(gòu)中的finally代碼塊里。

對(duì)于任何一個(gè)被Monitor鎖定對(duì)象,內(nèi)存中都保存著與它相關(guān)的一些信息:其一是現(xiàn)在持有鎖的線程的引用;其二是一個(gè)預(yù)備隊(duì)列,隊(duì)列中保存了已經(jīng)準(zhǔn)備好獲取鎖的線程;其三是一個(gè)等待隊(duì)列,隊(duì)列中保存著當(dāng)前正在等待這個(gè)對(duì)象狀態(tài)改變的隊(duì)列的引用。

當(dāng)擁有對(duì)象鎖的線程準(zhǔn)備釋放鎖時(shí),它使用Monitor.Pulse()方法通知等待隊(duì)列中的***個(gè)線程,于是該線程被轉(zhuǎn)移到預(yù)備隊(duì)列中,當(dāng)對(duì)象鎖被釋放時(shí),在預(yù)備隊(duì)列中的線程可以立即獲得對(duì)象鎖。

下面是一個(gè)展示如何使用lock關(guān)鍵字和C# Monitor類來(lái)實(shí)現(xiàn)線程的同步和通訊的例子,也是一個(gè)典型的生產(chǎn)者與消費(fèi)者問(wèn)題。

這個(gè)例程中,生產(chǎn)者線程和消費(fèi)者線程是交替進(jìn)行的,生產(chǎn)者寫(xiě)入一個(gè)數(shù),消費(fèi)者立即讀取并且顯示(注釋中介紹了該程序的精要所在)。

用到的系統(tǒng)命名空間如下:using System;using System.Threading;

首先,定義一個(gè)被操作的對(duì)象的類Cell,在這個(gè)類里,有兩個(gè)方法:ReadFromCell()和WriteToCell.消費(fèi)者線程將調(diào)用 ReadFromCell()讀取cellContents的內(nèi)容并且顯示出來(lái),生產(chǎn)者進(jìn)程將調(diào)用WriteToCell()方法向 cellContents寫(xiě)入數(shù)據(jù)。

示例如下:

  1.  public class Cell  
  2. {  
  3. int cellContents; // Cell對(duì)象里邊的內(nèi)容  
  4. bool readerFlag = false;   
  5. // 狀態(tài)標(biāo)志,為true時(shí)可以讀取,為false則正在寫(xiě)入  
  6. public int ReadFromCell( )  
  7. {  
  8. lock(this) // Lock關(guān)鍵字保證了什么,請(qǐng)大家看前面對(duì)lock的介紹  
  9. {  
  10. if (!readerFlag)//如果現(xiàn)在不可讀取  
  11. {  
  12. try  
  13. {  
  14. //等待WriteToCell方法中調(diào)用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標(biāo)志,表示消費(fèi)行為已經(jīng)完成  
  29. Monitor.Pulse(this);  
  30. //通知WriteToCell()方法(該方法在另外一個(gè)線程中執(zhí)行,等待中)  
  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. //當(dāng)同步方法(指Monitor類除Enter之外的方法)在非同步的代碼區(qū)被調(diào)用  
  48. Console.WriteLine(e);  
  49. }  
  50. catch (ThreadInterruptedException e)  
  51. {  
  52. //當(dāng)線程在等待狀態(tài)的時(shí)候中止  
  53. Console.WriteLine(e);  
  54. }  
  55. }  
  56. cellContents = n;  
  57. Console.WriteLine("Produce: {0}",cellContents);  
  58. readerFlag = true;  
  59. Monitor.Pulse(this);  
  60. //通知另外一個(gè)線程中正在等待的ReadFromCell()方法  
  61. }  
  62. }  

【編輯推薦】

  1. C#結(jié)構(gòu)體的特點(diǎn)淺析
  2. 介紹C#窗體拖動(dòng)事件
  3. C#讀取Excel遇到無(wú)法讀取的解決方法
  4. 概述C#.NET操作XML
  5. C#基礎(chǔ)概念學(xué)習(xí)筆記
責(zé)任編輯:佚名 來(lái)源: IT168
相關(guān)推薦

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-12 11:24:25

C# String對(duì)象

2009-08-31 09:37:09

C# Employee

2009-08-25 09:49:09

C#內(nèi)存Graphic

2009-08-25 10:08:39

C# MyData對(duì)象

2009-08-19 17:12:18

C# Connecti

2009-08-25 16:03:51

C# SQLDMO對(duì)象

2009-08-31 09:44:23

C# Employee

2009-08-26 10:34:59

C# Hashtabl

2009-09-02 15:41:21

C# HTTPWebR

2024-05-27 00:00:00

C# 類參數(shù)數(shù)據(jù)

2009-08-26 17:05:23

C# ThreadPo

2009-09-03 10:42:16

C# Employee

2009-09-03 15:57:11

C# SystemMe

2009-08-12 09:41:28

C# Director

2009-08-31 15:13:46

C# CWorker類

2009-08-21 17:24:06

C# SingleIn
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 成人午夜影院 | 日韩在线视频免费观看 | 欧美在线一区二区三区 | 国产精品污污视频 | 国产在线对白 | 欧美激情在线一区二区三区 | 精品国产乱码久久久久久丨区2区 | 国产亚洲精品久久久久久豆腐 | 亚洲免费网站 | 久久久久久国产精品 | 99久久精品一区二区成人 | 国产高清视频在线观看 | 国产综合在线视频 | 精品亚洲91 | 久久久久高清 | 国产精品av久久久久久毛片 | 岛国视频 | 国产视频1区| 九色国产 | 久久免费精品 | av中文字幕在线播放 | 欧美成人性生活 | 国产精品射| 亚洲一区 中文字幕 | 日韩成人免费视频 | 日本成人中文字幕 | 国产精品a久久久久 | 亚洲免费在线 | 国产精品综合视频 | 欧美黄色性生活视频 | 日本欧美黄色片 | 青娱乐国产| 一级片在线观看视频 | 91久久精品| 亚洲区一区二 | 天天躁日日躁aaaa视频 | 欧美日韩一区二区三区在线观看 | 欧美日韩不卡 | 粉嫩国产精品一区二区在线观看 | 草草草草视频 | av在线播放一区二区 |