Monitor 類鎖定一個對象html
當多線程公用一個對象時,也會出現和公用代碼相似的問題,這種問題就不該該使用lock關鍵字了,這裏須要用到System.Threading中的一個類Monitor,咱們能夠稱之爲監視器,Monitor提供了使線程共享資源的方案。 web
Monitor類能夠鎖定一個對象,一個線程只有獲得這把鎖才能夠對該對象進行操做。對象鎖機制保證了在可能引發混亂的狀況下一個時刻只有一個線程能夠訪問這個對象。 Monitor必須和一個具體的對象相關聯,可是因爲它是一個靜態的類,因此不能使用它來定義對象,並且它的全部方法都是靜態的,不能使用對象來引用。下面代碼說明了使用Monitor鎖定一個對象的情形:多線程
...... Queue oQueue=new Queue(); ...... Monitor.Enter(oQueue); ......//如今oQueue對象只能被當前線程操縱了 Monitor.Exit(oQueue);//釋放鎖 spa
如上所示,當一個線程調用Monitor.Enter()方法鎖定一個對象時,這個對象就歸它全部了,其它線程想要訪問這個對象,只有等待它使用Monitor.Exit()方法釋放鎖。爲了保證線程最終都能釋放鎖,你能夠把Monitor.Exit()方法寫在try-catch-finally結構中的finally代碼塊裏。線程
對於任何一個被Monitor鎖定的對象,內存中都保存着與它相關的一些信息: 其一是如今持有鎖的線程的引用; 其二是一個預備隊列,隊列中保存了已經準備好獲取鎖的線程; 其三是一個等待隊列,隊列中保存着當前正在等待這個對象狀態改變的隊列的引用。orm
當擁有對象鎖的線程準備釋放鎖時,它使用Monitor.Pulse()方法通知等待隊列中的第一個線程,因而該線程被轉移到預備隊列中,當對象鎖被釋放時,在預備隊列中的線程能夠當即得到對象鎖。 htm
已上內容轉自:http://www.cnblogs.com/xugang/archive/2008/03/23/1118594.html對象
Lock就不用多說了,只留作記錄blog
Lock 只能對引用對象加鎖隊列
Monitor 能夠對值類型加鎖,其實是在調用Monitor.Enter時對值類型裝箱了