基礎才是重中之重~lock和monitor的區別

張佔嶺發表於2018-05-18

回到目錄

Monitor的介紹

1.Monitor.Enter(object)方法是獲取鎖,Monitor.Exit(object)方法是釋放鎖,這就是Monitor最常用的兩個方法,當然在使用過程中為了避免獲取鎖之後因為異常,致鎖無法釋放,所以需要在try{} catch(){}之後的finally{}結構體中釋放鎖(Monitor.Exit())。

2.Monitor的常用屬性和方法:

  1. Enter(Object) 在指定物件上獲取排他鎖。
  2. Exit(Object) 釋放指定物件上的排他鎖。
  3. IsEntered 確定當前執行緒是否保留指定物件鎖。
  4. Pulse 通知等待佇列中的執行緒鎖定物件狀態的更改。
  5. PulseAll 通知所有的等待執行緒物件狀態的更改。
  6. TryEnter(Object) 試圖獲取指定物件的排他鎖。
  7. TryEnter(Object, Boolean) 嘗試獲取指定物件上的排他鎖,並自動設定一個值,指示是否得到了該鎖。
  8. Wait(Object) 釋放物件上的鎖並阻止當前執行緒,直到它重新獲取該鎖。

Lock的介紹 

 1.Lock關鍵字實際上是一個語法糖,它將Monitor物件進行封裝,給object加上一個互斥鎖,A程式進入此程式碼段時,會給object物件加上互斥鎖,此時其他B程式進入此程式碼段時檢查object物件是否有鎖?如果有鎖則繼續等待A程式執行完該程式碼段並且解鎖object物件之後,B程式才能夠獲取object物件為其加上鎖,訪問程式碼段。

 2.Lock關鍵字封裝的Monitor物件結構如下:

            try
            {
                Monitor.Enter(obj);
                dosomething();
            }
            catch(Exception ex)
            {
                
            }
            finally
            {
                Monitor.Exit(obj);
            }

3. lock的物件應該是私有的靜態物件

        private static object obj = new object();
        public void something()
        {
            lock (obj)
            {
                dosomething();
            }
        }

Monitor和Lock的區別

  1.Lock是Monitor的語法糖。

  2.Lock只能針對引用型別加鎖。

  3.Monitor能夠對值型別進行加鎖,實質上是Monitor.Enter(object)時對值型別裝箱。

感謝各位的閱讀!

回到目錄

相關文章