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

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

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

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

好口碑IT培訓(xùn)

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

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

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

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

·偏向鎖( Biased Locking)

·輕量級(jí)鎖

·重量級(jí)鎖

這三種鎖使得JDK得以?xún)?yōu)化Synchronized的運(yùn)行,當(dāng)JM檢測(cè)到不同的競(jìng)爭(zhēng)狀況時(shí),會(huì)自動(dòng)切換到適合的鎖實(shí)現(xiàn),這就是鎖的升級(jí)、降級(jí)。

·當(dāng)沒(méi)有競(jìng)爭(zhēng)出現(xiàn)時(shí),默認(rèn)會(huì)使用偏向鎖。

JVM會(huì)利用CAS操作,在對(duì)象頭上的Mark Word部分設(shè)置線(xiàn)程ID,以表示這個(gè)對(duì)象偏向于當(dāng)前線(xiàn)程,所以并不涉及真正的互斥鎖,因?yàn)樵诤芏鄳?yīng)用場(chǎng)景中,大部分對(duì)象生命周期中最多會(huì)被一個(gè)線(xiàn)程鎖定,使用偏斜鎖可以降低無(wú)競(jìng)爭(zhēng)開(kāi)銷(xiāo)。

·如果有另一線(xiàn)程試圖鎖定某個(gè)被偏斜過(guò)的對(duì)象,JM就撤銷(xiāo)偏斜鎖,切換到輕量級(jí)鎖實(shí)現(xiàn)。

·輕量級(jí)鎖依賴(lài)CAS操作Mark Word來(lái)試圖獲取鎖,如果重試成功,就使用普通的輕量級(jí)鎖;否則,進(jìn)一步升級(jí)為重量級(jí)鎖。


猜你喜歡:

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

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

Docker 安裝教程|在線(xiàn)安裝、離線(xiàn)安裝和腳本文件安裝

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

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

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