Java偏向鎖淺析


偏向鎖的定義

顧名思義,偏向鎖會偏向第一個訪問鎖的線程。

如果在接下來的運行過程中,該鎖沒有被其他線程訪問,這持有偏向鎖的線程將永遠不需要同步

如果在運行過程中,遇到了其他線程搶占鎖,則持有偏向鎖的線程會被掛起,JVM會嘗試消除他身上的偏向鎖,將鎖恢復到標准的輕量級鎖(CAS),也就是說,偏向鎖,只在單線程環境下起作用

當鎖對象第一次被線程獲取的時候,虛擬機會將該對象頭部的mardword中的標示位設置為01,即偏向模式。將該線程的id存在markword中,成功之后,持有該鎖的線程以后就不再進行任何同步操作,但是在另外一個線程嘗試獲該鎖的時候,這個偏向模式宣告結束

偏向鎖針對的場景

偏向鎖是為了針對“大多數情況下,鎖不僅不存在多線程競爭,而且總由同一個線程獲取”的情況

這是為了對那些歷史遺留的Collectionn類如Vector和HashTable等類做的優化。

偏向鎖的問題

偏向鎖撤銷的代價很大,需要進入safepoint,如果是競爭十分激烈的多線程程序,一開始就關掉偏向鎖是一個比較好的選擇

safepoint:safepoin是一個安全點,所有線程執行到安全點的時候就會去檢查,是否需要執行safepoint操作,如果需要執行,那么所有線程就會的等待,直到所有線程進入到safepoint。

緊接上面說的問題,撤銷偏向鎖的時候需要所有線程都阻塞等到進入safepoint,這種開銷無疑是巨大的,尤其是在鎖競爭激烈的多線程程序中,偏向鎖會影響到程序的運行效率,這也是為什么在jdk15中,已經默認關閉了偏向鎖模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM