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

JVM對Java的原生鎖做了哪些優化?

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

好口碑IT培訓

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

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

再讓線程執行阻塞操作,避免了用戶態到內核態的切換。

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

·偏向鎖( Biased Locking)

·輕量級鎖

·重量級鎖

這三種鎖使得JDK得以優化Synchronized的運行,當JM檢測到不同的競爭狀況時,會自動切換到適合的鎖實現,這就是鎖的升級、降級。

·當沒有競爭出現時,默認會使用偏向鎖。

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

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

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


猜你喜歡:

Mybatis執行SQL命令是怎么實現的?

ArrayList和LinkedList的區別和聯系匯總

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

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

Java高級軟件工程是培訓課程 

人妻系列无码专区_漂亮人妻被中出中文字幕_人妻中文制服巨乳中文