监视器和锁
在JVM的規(guī)范中,有這么一些話:
“在JVM中,每個(gè)對象和類在邏輯上都是和一個(gè)監(jiān)視器相關(guān)聯(lián)的”
“為了實(shí)現(xiàn)監(jiān)視器的排他性監(jiān)視能力,JVM為每一個(gè)對象和類都關(guān)聯(lián)一個(gè)鎖”
“鎖住了一個(gè)對象,就是獲得對象相關(guān)聯(lián)的監(jiān)視器”
從這些話,看出監(jiān)視器和對象鎖好像是一回事,那為何要定義兩個(gè)東西,若不一樣,他們的關(guān)系如何?
------------------------------------------------------------------------------------------
監(jiān)視器好比一做建筑,它有一個(gè)很特別的房間,房間里有一些數(shù)據(jù),而且在同一時(shí)間只能被一個(gè)線程占據(jù),
進(jìn)入這個(gè)建筑叫做"進(jìn)入監(jiān)視器",訪問資源時(shí)
進(jìn)入建筑中的那個(gè)特別的房間叫做"獲得監(jiān)視器",可以訪問資源時(shí)
占據(jù)房間叫做"持有監(jiān)視器",可以訪問資源,并獲得資源鎖
離開房間叫做"釋放監(jiān)視器",釋放鎖
離開建筑叫做"退出監(jiān)視器". 訪問結(jié)束
如果監(jiān)視器被持有,還有線程要訪問房間,此時(shí)線程將在房間外排除等候。
------------------------------------------------------------------------------------------
監(jiān)視器:monitor
鎖:lock(JVM里只有一種獨(dú)占方式的lock)
進(jìn)入監(jiān)視器:monitorenter
離開/釋放監(jiān)視器:monitorexit
(monitorenter和monitorexit是JVM的指令)
擁有者:owner
在JVM里,monitor就是實(shí)現(xiàn)lock的方式。
monitorenter就是獲得某個(gè)對象的lock(owner是當(dāng)前線程)
monitorexit就是釋放某個(gè)對象的lock
在java中,synchronized是唯一實(shí)現(xiàn)同步的東西。對于下面的java程序:
synchronized(obj)
{
... ...
}
在class中將被翻譯成
monitorenter(obj)
...
monitorexit(obj)
結(jié)合我上面對這些英文名詞的介紹,很容易理解monitor和lock的關(guān)系。
“在JVM中,每個(gè)對象和類在邏輯上都是和一個(gè)監(jiān)視器相關(guān)聯(lián)的”
“為了實(shí)現(xiàn)監(jiān)視器的排他性監(jiān)視能力,JVM為每一個(gè)對象和類都關(guān)聯(lián)一個(gè)鎖”
“鎖住了一個(gè)對象,就是獲得對象相關(guān)聯(lián)的監(jiān)視器”
從這些話,看出監(jiān)視器和對象鎖好像是一回事,那為何要定義兩個(gè)東西,若不一樣,他們的關(guān)系如何?
------------------------------------------------------------------------------------------
監(jiān)視器好比一做建筑,它有一個(gè)很特別的房間,房間里有一些數(shù)據(jù),而且在同一時(shí)間只能被一個(gè)線程占據(jù),
進(jìn)入這個(gè)建筑叫做"進(jìn)入監(jiān)視器",訪問資源時(shí)
進(jìn)入建筑中的那個(gè)特別的房間叫做"獲得監(jiān)視器",可以訪問資源時(shí)
占據(jù)房間叫做"持有監(jiān)視器",可以訪問資源,并獲得資源鎖
離開房間叫做"釋放監(jiān)視器",釋放鎖
離開建筑叫做"退出監(jiān)視器". 訪問結(jié)束
如果監(jiān)視器被持有,還有線程要訪問房間,此時(shí)線程將在房間外排除等候。
------------------------------------------------------------------------------------------
監(jiān)視器:monitor
鎖:lock(JVM里只有一種獨(dú)占方式的lock)
進(jìn)入監(jiān)視器:monitorenter
離開/釋放監(jiān)視器:monitorexit
(monitorenter和monitorexit是JVM的指令)
擁有者:owner
在JVM里,monitor就是實(shí)現(xiàn)lock的方式。
monitorenter就是獲得某個(gè)對象的lock(owner是當(dāng)前線程)
monitorexit就是釋放某個(gè)對象的lock
在java中,synchronized是唯一實(shí)現(xiàn)同步的東西。對于下面的java程序:
synchronized(obj)
{
... ...
}
在class中將被翻譯成
monitorenter(obj)
...
monitorexit(obj)
結(jié)合我上面對這些英文名詞的介紹,很容易理解monitor和lock的關(guān)系。
總結(jié)
- 上一篇: 初出茅庐的小李第36篇博客之读取旋转编码
- 下一篇: 廉洁文化 计算机学院,计算机学院“廉洁在