C#中多线程同步的Monitor理解
生活随笔
收集整理的這篇文章主要介紹了
C#中多线程同步的Monitor理解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
.NET提供了System.Threading.Monitor類允許同一進城中的線程實現(xiàn)同步,是一種更快速、更輕量級的鎖機制。可以使用該類來保護對某些變量的訪問,或?qū)δ承┮淮沃荒茉谝粋€線程中執(zhí)行的代碼設置訪問權限。
使用實例(片段代碼):
- Monitor與lock
對以上代碼的解讀: - Monitor.Enter(theLock)獲得theLock對象鎖;Monitor.Exit(theLock)釋放theLock對象鎖;
- 我們將所有對num變量的訪問以對象鎖的形式房在臨界區(qū),在每次訪問前,訪問者必須獲得theLock對象實例的鎖。theLock字段類型是 Object類型,它的實際類型無關緊要,但必須是引用類型即對象的實例,而不是值類型。為了安全起見,建議標記成readonly,以免theLock 被復制而造成混亂。
- 上述代碼不夠簡潔,使用try/finally,而且一旦漏掉Monitor.Exit將會發(fā)生可怕的混亂。就此問題C#設計者引用了lock關鍵字,lock關鍵字代替了Monitor.Enter和Monitor.Exit,上述代碼可簡寫為: readonly object theLock=new object();int num=0;#其他代碼...lock(theLock){++num;}
- 通知與等待
- Monitor管理著兩個線程隊列:就緒隊列(ready隊列)和等待隊列(waiting隊列)。
- ready隊列保存的是準備獲取鎖的線程,就是說,如果某個線程(幾座線程A)執(zhí)行了Monitor.Wait(),那么ready隊列中的第一個線程就會獲得鎖,開始運行;同時線程A自動進入waiting隊列中的隊尾進行排隊。
- waiting隊列保存的是正在等待鎖對象狀態(tài)變化通知的線程,就是說如果某個線程執(zhí)行了Moniotr.Pulse(),那么waiting隊列中的對頭線程就進入ready隊列中。
- 簡單地說即是當前線程執(zhí)行Monitor.Wait(),當前線程進入waiting隊列并取ready隊列對頭線程運行;執(zhí)行Monitor.Pulse把waiting隊列的對頭線程調(diào)入ready隊列。
轉(zhuǎn)載于:https://www.cnblogs.com/zhaiqianfeng/archive/2012/11/06/4617989.html
總結
以上是生活随笔為你收集整理的C#中多线程同步的Monitor理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual C++ 2008入门经典
- 下一篇: C#-Home / 详解Asp.Net