標籤:style color os sp strong on bs ad new
object obj=new object();
Monitor在鎖對象obj上會維持兩個線程隊列R和W以及一個引用T :
(1) T是對當前獲得了obj鎖的線程的引用(設此線程為CurrThread);
(2) R為就緒隊列,其上的線程已經準備好擷取obj鎖。當obj鎖被CurrThread釋放後(CurrThread可通過Monitor.Exit(obj)或Monitor.Wait(obj)來釋放其所獲的obj鎖)這些線程就會去競爭obj鎖,獲得obj鎖的線程將被T引用; 線程調用Monitor.Enter(obj)或Monitor.TryEnter(obj)將會使該線程直接進入R隊列。
(3) W為等待隊列,其上的線程是因為調用了Monitor.Wait(obj)而進入W隊列的;W上的線程不會被OS直接調度執行,也就是說它們沒有準備好擷取obj鎖,就是說在等待隊列上的線程不能去獲得obj鎖。當前獲得obj鎖的線程CurrThread調用Monitor.Pulse(obj)或Monitor.PulseAll(obj)後會使W隊列中的第一個等待線程或所有等待線程被移至R隊列,這時被移至R隊列的這些線程就有機會被OS直接調度執行,也就是有可以去競爭obj鎖。
(4)Monitor的成員方法
Monitor.Enter(obj)/Monitor.TryEnter(obj) : 線程會進入R隊列以等待擷取obj鎖
Monitor.Exit(obj) : 線程釋放obj鎖(只有擷取了obj鎖的線程才能執行Monitor.Exit(obj))
Monitor.Wait(obj): 線程釋放當前獲得的obj鎖,然後進入W隊列並阻塞
Monitor.Pulse(obj) : 將W隊列中的第一個等待線程移至R隊列中以使第一個線程有機會擷取obj鎖
Monitor.PulseAll(obj): 將W隊列中的所有等待線程移至R隊列以使得這些線程有機會獲得obj鎖
[轉]C#中的Monitor類