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

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

JVM對Java的原生鎖做了哪些優(yōu)化?

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

好口碑IT培訓(xùn)

JVM對Java的原生鎖做了哪些優(yōu)化?在Java之前,Monitor的實現(xiàn)完全依賴底層操作系統(tǒng)的互斥鎖來實現(xiàn),也就是我們剛才在問題二中所聞述的獲取/釋放鎖的邏輯。

由于Java層面的線程與操作系統(tǒng)的原生線程有映射關(guān)系,如果要將一個線程進行阻塞或喚起都需要操作系統(tǒng)的協(xié)助,這就需要從用戶態(tài)切換到內(nèi)核態(tài)來執(zhí)行,這種切換代價十分昂貴,很耗處理器時間,現(xiàn)代JDK中做了大量的優(yōu)化。一種優(yōu)化是使用自旋鎖,即在把線程進行阻塞操作之前先讓線程自旋等待一段時間,可能在等待期間其他線程已經(jīng)解鎖,這時就無再讓線程執(zhí)行阻塞操作,避免了用戶態(tài)到內(nèi)核態(tài)的切換。

再讓線程執(zhí)行阻塞操作,避免了用戶態(tài)到內(nèi)核態(tài)的切換。

現(xiàn)代JDK中還提供了三種不同的 Monitor實現(xiàn),也就是三種不同的鎖:

·偏向鎖( Biased Locking)

·輕量級鎖

·重量級鎖

這三種鎖使得JDK得以優(yōu)化Synchronized的運行,當(dāng)JM檢測到不同的競爭狀況時,會自動切換到適合的鎖實現(xiàn),這就是鎖的升級、降級。

·當(dāng)沒有競爭出現(xiàn)時,默認(rèn)會使用偏向鎖。

JVM會利用CAS操作,在對象頭上的Mark Word部分設(shè)置線程ID,以表示這個對象偏向于當(dāng)前線程,所以并不涉及真正的互斥鎖,因為在很多應(yīng)用場景中,大部分對象生命周期中最多會被一個線程鎖定,使用偏斜鎖可以降低無競爭開銷。

·如果有另一線程試圖鎖定某個被偏斜過的對象,JM就撤銷偏斜鎖,切換到輕量級鎖實現(xiàn)。

·輕量級鎖依賴CAS操作Mark Word來試圖獲取鎖,如果重試成功,就使用普通的輕量級鎖;否則,進一步升級為重量級鎖。


猜你喜歡:

Mybatis執(zhí)行SQL命令是怎么實現(xiàn)的?

ArrayList和LinkedList的區(qū)別和聯(lián)系匯總

Docker 安裝教程|在線安裝、離線安裝和腳本文件安裝

單例中懶漢和惡漢模式的區(qū)別【Java面試題】

Java高級軟件工程是培訓(xùn)課程 

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