c#線程同步(3)----monitor

首先lock和Minitor有什麼區別呢?
其實lockIL代碼中會被翻譯成Monitor。也就是Monitor.Enter(obj)Monitor.Exit(obj).
lock(obj)
{
}
等價爲:
try
{    
      Monitor.Enter(obj) 
}
catch()
{}
finally
{
      Monitor.Exit(obj) 
}
所以lock能做的,Monitor肯定能做,Monitor能做的,lock不一定能做。那麼Monitor額外的功能呢?
1:Monitor.TryEnter(obj,timespan)----timeout之後,就不執行這段代碼了。lock可是一直會死等的。

2:還有Monitor.Wait()Monitor.Pulse()。在lock代碼裏面如果調用了Monitor.Wait(),會放棄對資源的所有權,讓別的線程lock進來。然後別的線程代碼裏Pulse一下(讓原線程進入到等待隊列),然後在Wait一下釋放資源,這樣原線程的就可以繼續執行了(代碼還堵塞在wait那句話呢)。
也就是說,必須兩個或多個線程共同調用WaitPulse,把資源的所有權拋來拋去,纔不會死鎖。

1.Monitor.Wait方法
當線程調用 Wait 時,它釋放對象的鎖並進入對象的等待隊列,對象的就緒隊列中的下一個線程(如果有)獲取鎖並擁有對對象的獨佔使用。
Wait()就是交出鎖的使用權,使線程處於阻塞狀態,直到再次獲得鎖的使用權。

2.Monitor.Pulse方法
當前線程調用此方法以便向隊列中的下一個線程發出鎖的信號。接收到脈衝後,等待線程就被移動到就緒隊列中。在調用 Pulse 的線程釋放鎖後,就緒隊列中的下一個線程(不一定是接收到脈衝的線程)將獲得該鎖。pulse()並不會使當前線程釋放鎖。

發佈了24 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章