基礎才是重中之重~lock和monitor的區別
Monitor的介紹
1.Monitor.Enter(object)方法是(shi)獲取鎖(suo)(suo),Monitor.Exit(object)方法是(shi)釋(shi)放鎖(suo)(suo),這(zhe)就是(shi)Monitor最(zui)常(chang)用的(de)兩個方法,當然在使用過程(cheng)中為了避免獲取鎖(suo)(suo)之后因為異常(chang),致鎖(suo)(suo)無法釋(shi)放,所以需要在try{} catch(){}之后的(de)finally{}結構體中釋(shi)放鎖(suo)(suo)(Monitor.Exit())。
2.Monitor的常用屬性和方法(fa):
- Enter(Object) 在指定對象上獲取排他鎖。
- Exit(Object) 釋放指定對象上的排他鎖。
- IsEntered 確定當前線程是否保留指定對象鎖。
- Pulse 通知等待隊列中的線程鎖定對象狀態的更改。
- PulseAll 通知所有的等待線程對象狀態的更改。
- TryEnter(Object) 試圖獲取指定對象的排他鎖。
- TryEnter(Object, Boolean) 嘗試獲取指定對象上的排他鎖,并自動設置一個值,指示是否得到了該鎖。
- Wait(Object) 釋放對象上的鎖并阻止當前線程,直到它重新獲取該鎖。
Lock的介紹
1.Lock關鍵字實(shi)際上(shang)是一個語法糖,它將Monitor對(dui)(dui)(dui)象進(jin)(jin)行封裝,給object加上(shang)一個互(hu)斥鎖,A進(jin)(jin)程(cheng)進(jin)(jin)入此代(dai)碼段時,會給object對(dui)(dui)(dui)象加上(shang)互(hu)斥鎖,此時其(qi)他(ta)B進(jin)(jin)程(cheng)進(jin)(jin)入此代(dai)碼段時檢查object對(dui)(dui)(dui)象是否有鎖?如果(guo)有鎖則繼續等待A進(jin)(jin)程(cheng)運行完該代(dai)碼段并且解鎖object對(dui)(dui)(dui)象之后,B進(jin)(jin)程(cheng)才能夠(gou)獲取object對(dui)(dui)(dui)象為其(qi)加上(shang)鎖,訪問代(dai)碼段。
2.Lock關鍵(jian)字封裝的Monitor對(dui)象結構(gou)如下:
try { Monitor.Enter(obj); dosomething(); } catch(Exception ex) { } finally { Monitor.Exit(obj); }
3. lock的(de)對(dui)象應(ying)該(gai)是私(si)有的(de)靜(jing)態對(dui)象
private static object obj = new object(); public void something() { lock (obj) { dosomething(); } }
Monitor和Lock的區別
1.Lock是Monitor的語(yu)法糖。
2.Lock只(zhi)能針(zhen)對(dui)引用類型加(jia)鎖。
3.Monitor能夠(gou)對值類(lei)型進行加鎖,實質上是Monitor.Enter(object)時對值類(lei)型裝箱。
感謝各位的閱讀!