C#中Monitor物件與Lock關鍵字的區別分析
阿新 • • 發佈:2020-10-20
這篇文章主要介紹了C#中Monitor物件與Lock關鍵字的區別,需要的朋友可以參考下
Monitor物件
1.Monitor.Enter(object)方法是獲取 鎖,Monitor.Exit(object)方法是釋放鎖,這就是Monitor最常用的兩個方法,當然在使用過程中為了避免獲取鎖之後因為異常,致鎖 無法釋放,所以需要在try{} catch(){}之後的finally{}結構體中釋放鎖(Monitor.Exit())。
2.Monitor的常用屬性和方法:
Enter(Object) 在指定物件上獲取排他鎖。 Exit(Object) 釋放指定物件上的排他鎖。 IsEntered 確定當前執行緒是否保留指定物件鎖。 Pulse 通知等待佇列中的執行緒鎖定物件狀態的更改。 PulseAll 通知所有的等待執行緒物件狀態的更改。 TryEnter(Object) 試圖獲取指定物件的排他鎖。 TryEnter(Object, Boolean) 嘗試獲取指定物件上的排他鎖,並自動設定一個值,指示是否得到了該鎖。 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.鎖定的物件應該宣告為private static object obj = new object();儘量別用公共變數和字串、this、值型別。
Monitor和Lock的區別
1.Lock是Monitor的語法糖。
2.Lock只能針對引用型別加鎖。
3.Monitor能夠對值型別進行加鎖,實質上是Monitor.Enter(object)時對值型別裝箱。
4.Monitor還有其他的一些功能。
本文程式碼示例:
程式碼如下:class Program { private static object obj = new object(); public void LockSomething() { lock (obj) { dosomething(); } } public void MonitorSomeThing() { try { Monitor.Enter(obj); dosomething(); } catch(Exception ex) { } finally { Monitor.Exit(obj); } } public void dosomething() { //做具體的事情 } }轉載:https://www.cnblogs.com/cuihongyu3503319/p/5730268.html