圖解 synchronized 的鎖升級機制


synchronized 鎖升級流程圖

Synchronized關鍵字可以用來修飾方法或者代碼塊。對於同步方法,JVM 采用 ACC_SYNCHRONIZED 標記符來實現同步。 對於同步代碼塊。JVM 采用 monitorenter、monitorexit 兩個指令來實現同步。

在JDK1.6之后對對synchronized鎖進行了升級,在1.6之前synchronized直接加重量級鎖,但是1.6之后對其性能進行了優化,采用鎖升級的機制:偏向鎖->自旋鎖(輕量級鎖)->重量級鎖。

初次執行到synchronized代碼塊的時候,鎖對象變成偏向鎖。線程執行並不會主動釋放鎖。第二次到達代碼塊的時候,線程會判斷之前的線程是不是自己,如果是自己的話,由於前面沒有釋放鎖的操作,這里也就不用重新加鎖,就沒有加鎖、解鎖的開銷了。

當第二個線程過來,兩個線程產生了競爭,就會從偏向鎖升級成自旋鎖。自旋鎖競爭狀態中,沒有獲得鎖的線程,就會不斷自旋判斷自己是否拿到了鎖,沒有拿到鎖就會忙等。


免責聲明!

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



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