參考資料:
1:https://howtodoinjava.com/java/multi-threading/multithreading-difference-between-lock-and-monitor/
2:https://www.cnblogs.com/noteless/p/10394054.html
3:https://www.cnblogs.com/keeplearnning/p/7020287.html
4:https://wangxinchun.iteye.com/blog/2367654
java面試中比較常見的問題剂娄,籠統(tǒng)的說:lock是monitor更深層的實現(xiàn)方式冈闭。下面還是詳細回憶下帅掘,昨日學習內(nèi)容。
糾正:
- lock為實現(xiàn)monitor提供了必要的支持
鎖(lock):
鎖是對象頭里的一個邏輯結構这难,當線程持有該對象的鎖時(synchronize關鍵字),其他線程若想訪問該資源對象,則必須等待持有者線程釋放鎖恢恼。
糾正:
- 在堆內(nèi)存中,鎖是對象頭中的一種邏輯數(shù)據(jù)
補充:
- JVM中每個對象都擁有一個鎖(或互斥鎖)
- 任何程序都可以使用它胰默,來對該對象多線程訪問的協(xié)調(diào)场斑。即:任何現(xiàn)場想訪問該對象的實例變量漓踢,則必須持有該對象的鎖(在鎖內(nèi)存區(qū)域設置一些值),所有其他想訪問該對象的線程漏隐,必須等待持有鎖的線程釋放該對象的鎖(改變標記)
注意:
- java中喧半,類對象、實例對象是不同的對象
// 鎖的是ClassObjLock類對象
public void ClassObjLock() {
public void classLock() {
synchronized(getClass()) {
dosomethings...
}
}
}
猜測:
以上代碼青责,若某線程調(diào)用classLock方法挺据,在執(zhí)行完成該方法前(即未釋放鎖)
那么另一線程進行構造對象操作:new ClassObjLock() 是否會報錯?
**猜測會報錯**
// 鎖的是ClassObjLock類的實例對象
public void InstanceObjLock() {
public void InstanceLock() {
// this指向每個由該類構造的實例對象
synchronized(this) {
dosomethings...
}
}
}
監(jiān)視器(monitor):
監(jiān)視器是一個邏輯結構脖隶,可以比作是一個建筑物扁耐,建筑物里有一間特殊的房間,稱為資源對象产阱。線程進入房間獲取資源前婉称,需先進入建筑物,若資源對象被其他線程持有构蹬,那后續(xù)進入的線程王暗,將在入口集(entry set)中等待。某線程在對資源對象處理完成后庄敛,將會釋放對象瘫筐,并退出監(jiān)視器。
糾正:
- 特殊房間只是一個實例對象铐姚,一般包含了需要并發(fā)訪問的數(shù)據(jù)策肝。同一時刻只能有一個線程訪問該房間(獨占)
- 相關名詞:
- 進入建筑物 -- 進入監(jiān)視器 2. 嘗試進入房間 -- 獲取監(jiān)視器 3. 占有房間 -- 持有監(jiān)視器 3. 退出房間 -- 釋放監(jiān)視器 4. 退出建筑物 -- 退出監(jiān)視器
- 監(jiān)視器有互斥和合作兩種模式(理解錯誤 !!!)
- 監(jiān)視器使線程同時具有互斥和合作的特點
- 互斥:使用Lock
入口集排隊 --> 獲取鎖,持有監(jiān)視器 --> 釋放鎖隐绵,釋放監(jiān)視器 --> 退出監(jiān)視器之众。在該模式下,不需要使用到等待集依许。 - 合作:使用等待集(wait-set)棺禾,即等待某些條件變?yōu)檎?br> 一個線程需要一些處于特定狀態(tài)的數(shù)據(jù),另一線程則負責將該數(shù)據(jù)置為該狀態(tài)時峭跳,合作是非常重要的膘婶。如:消費者/生產(chǎn)者模式:讀線程需要緩沖區(qū)非空狀態(tài)時,才能從緩沖區(qū)中讀取任何數(shù)據(jù)蛀醉,若讀線程發(fā)現(xiàn)緩沖區(qū)為空悬襟,則必須等待,寫線程則負責寫入數(shù)據(jù)拯刁。 也稱:Wait and Notify或Signal and Continue監(jiān)視器脊岳,因為它(等待線程 疑問1)保留了監(jiān)視器的所有權(不是持有鎖! 疑問2),并在需要時繼續(xù)執(zhí)行監(jiān)視區(qū)域(同步代碼塊)割捅;稍后奶躯,通知線程釋放監(jiān)視器,等待線程被喚醒去獲取鎖亿驾。
- 互斥:使用Lock
2019-07-20 8:37:00
疑問:
- 它指代什么嘹黔?等待線程?理由是什么莫瞬?
- 保留監(jiān)視器的所有權参淹,是指什么?持有鎖嗎乏悄?理由是什么浙值?
注意:
- 監(jiān)視器是邏輯結構,也就說是一種模型檩小,并不像Lock一樣實實在在的存在于內(nèi)存中
- jvm中开呐,每一個對象都有一個鎖,同時也綁定了一個監(jiān)視器规求,其中監(jiān)視器用來協(xié)調(diào)多個線程訪問同一對象的的執(zhí)行順序
2019-07-18 22:20:00
疑問:
- 等待集有什么用筐付?里面的線程,如何退出阻肿?
2019-07-20 10:08:00
在互斥時瓦戚,不需要等待集;在合作時丛塌,等待集一般通過java中的wait關鍵字實現(xiàn)较解。
等待集的線程不存在退出說法,只有持有監(jiān)視器的線程赴邻,才能數(shù)據(jù)狀態(tài)不滿足的情況下印衔,進入等待集等待或直接退出監(jiān)視器。參考資料3
image
監(jiān)視器-合作模式