Synchronized關鍵字可以用來修飾方法或者代碼塊。對於同步方法,JVM 採用 ACC_SYNCHRONIZED 標記符來實現同步。 對於同步代碼塊。JVM 採用 monitorenter、monitorexit 兩個指令來實現同步。 在JDK1.6之後對對synchronized鎖進行了升級 ...
Synchronized關鍵字可以用來修飾方法或者代碼塊。對於同步方法,JVM 採用 ACC_SYNCHRONIZED 標記符來實現同步。 對於同步代碼塊。JVM 採用 monitorenter、monitorexit 兩個指令來實現同步。
在JDK1.6之後對對synchronized鎖進行了升級,在1.6之前synchronized直接加重量級鎖,但是1.6之後對其性能進行了優化,採用鎖升級的機制:偏向鎖->自旋鎖(輕量級鎖)->重量級鎖。
初次執行到synchronized代碼塊的時候,鎖對象變成偏向鎖。線程執行並不會主動釋放鎖。第二次到達代碼塊的時候,線程會判斷之前的線程是不是自己,如果是自己的話,由於前面沒有釋放鎖的操作,這裡也就不用重新加鎖,就沒有加鎖、解鎖的開銷了。
當第二個線程過來,兩個線程產生了競爭,就會從偏向鎖升級成自旋鎖。自旋鎖競爭狀態中,沒有獲得鎖的線程,就會不斷自旋判斷自己是否拿到了鎖,沒有拿到鎖就會忙等。