多執行緒-----經典解釋監視器和物件鎖
在JVM的規範中,有這麼一些話:
“在JVM中,每個物件和類在邏輯上都是和一個監視器相關聯的”
“為了實現監視器的排他性監視能力,JVM為每一個物件和類都關聯一個鎖”
“鎖住了一個物件,就是獲得物件相關聯的監視器”
從這些話,看出監視器和物件鎖好像是一回事,那為何要定義兩個東西,若不一樣,他們的關係如何?
解釋1:
監視器好比一座建築,它有一個很特別的房間,房間裡有一些資料,而且在同一時間只能被一個執行緒佔據,進入這個建築叫做"進入監視器",進入建築中的那個特別的房間叫做"獲得監視器",佔據房間叫做"持有監視器",離開房間叫做"釋放監視器",離開建築叫做"退出監視器".
而一個鎖就像一種任何時候只允許一個執行緒擁有的特權.
一個執行緒可以允許多次對同一物件上鎖.對於每一個物件來說,java虛擬機器維護一個計數器,記錄物件被加了多少次鎖,沒被鎖的物件的計數器是0,執行緒每加鎖一次,計數器就加1,每釋放一次,計數器就減1.當計數器跳到0的時候,鎖就被完全釋放了.
java虛擬機器中的一個執行緒在它到達監視區域開始處的時候請求一個鎖.JAVA程式中每一個監視區域都和一個物件引用相關聯.
去看一下深入java虛擬機器吧,裡面這個講的很清楚!
解釋2:
翻譯式解釋
監視器:monitor
鎖:lock(JVM裡只有一種獨佔方式的lock)
進入監視器:entermonitor
離開/釋放監視器:leavemonitor
(entermonitor和leavemonitor是JVM的指令)
擁有者:owner
在JVM裡,monitor就是實現lock的方式。
entermonitor就是獲得某個物件的lock(owner是當前執行緒)
leavemonitor就是釋放某個物件的lock