1. 程式人生 > >鎖的升級與降級

鎖的升級與降級

synchronized程式碼塊是由monitorenter / monitorexit指令實現的

現在JVM提供了三種監視器,偏向鎖,輕量級鎖,重量級鎖。為了優化同步的執行機制,有了升級與降級,當JVM檢測到不同的競爭狀態時採取合適的鎖的實現。

當沒有競爭的時候,預設使用偏向鎖,JVM利用CAS操作,在物件頭的MarkWord設定了執行緒ID,表示這個物件偏向於當前執行緒,但是這並不真正的涉及到互斥鎖。一般用偏向鎖也可以無競爭的開銷。

如果有另外的執行緒試著鎖定某個被偏向過得物件,JVM首先會撤銷偏向鎖。然後切換到輕量級鎖的實現,通過CAS修改物件頭的MarkWord來試圖獲取鎖,如果重試成功,就使用普通的輕量級鎖,如果重試不成功,就會膨化為重量級鎖。