教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java Synchronized原理是什么?Synchronized原理詳解

更新時間:2020年12月08日15時08分 來源:傳智教育 瀏覽次數(shù):

好口碑IT培訓(xùn)

Synchronized原理是Java面試中幾乎百分百會問到的問題,因為沒有任何寫過并發(fā)程序的開發(fā)者會沒聽說或者沒接觸過Synchronized。

Synchronized是由JVM實現(xiàn)的一種實現(xiàn)互斥同步的一種方式,如果你查看被Synchronized修飾過的程序塊編譯后的字節(jié)碼,會發(fā)現(xiàn),被Synchronized修飾過的程序塊,在編譯前后被編譯器生成了monitorenter和monitorexit兩個字節(jié)碼指令。

Synchronized原理


這兩個指令是什么意思呢?在虛擬機執(zhí)行到monitorenter指令時,首先要嘗試獲取對象的鎖:如果這個對象沒有鎖定,或者當(dāng)前線程已經(jīng)擁有了這個對象的鎖,把鎖的計數(shù)器+1;當(dāng)執(zhí)行 monitorexit指令時將鎖計數(shù)器-1;當(dāng)計數(shù)器為O時,鎖就被釋放了。如果獲取對象失敗了,那當(dāng)前線程就要阻塞等待,直到對象鎖被另外一個線程釋放為止。Java中Synchronize通過在對象頭設(shè)置標(biāo)記,達(dá)到了獲取鎖和釋放鎖的目的。

“鎖”的本質(zhì)其實是monitorenter和monitorexit字節(jié)碼指令的一個Reference類型的參數(shù),即要鎖定和解鎖的對象。我們知道,使用Synchronized可以修飾不同的對象,因此,對應(yīng)的對象鎖可以這么確定。

1. 如果Synchronized明確指定了鎖對象,比如Synchronized(變量名)、Synchronized(this)等,說明加解鎖對象為該對象。

2. 如果沒有明確指定:

若Synchronized修飾的方法為非靜態(tài)方法,表示此方法對應(yīng)的對象為鎖對象;

若Synchronized修飾的方法為靜態(tài)方法,則表示此方法對應(yīng)的類對象為鎖對象;

注意,當(dāng)一個對象被鎖住時,對象里面所有用Synchronized修飾的方法都將產(chǎn)生堵塞,而對象里非Synchronized修飾的方法可正常被調(diào)用,不受鎖影響。



猜你喜歡:

0 分享到:
和我們在線交談!