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

全國(guó)咨詢/投訴熱線:400-618-4000

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

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

好口碑IT培訓(xùn)

Synchronized原理是Java面試中幾乎百分百會(huì)問(wèn)到的問(wèn)題,因?yàn)闆](méi)有任何寫過(guò)并發(fā)程序的開(kāi)發(fā)者會(huì)沒(méi)聽(tīng)說(shuō)或者沒(méi)接觸過(guò)Synchronized。

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

Synchronized原理


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

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

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

2. 如果沒(méi)有明確指定:

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

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

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



猜你喜歡:

0 分享到:
和我們?cè)诰€交談!