reentrantLock 和 synchronized 哪个性能高?
??點擊上方?好好學java?,選擇?星標?公眾號
重磅資訊、干貨,第一時間送達 今日推薦:一個線程池 bug 引發的 GC 思考!個人原創+1博客:點擊前往,查看更多 鏈接:https://segmentfault.com/a/1190000022041809synchronized 底層實現由jvm 保證,
在jvm 運行過程中,可能出現 偏向鎖,輕量級鎖,重量級鎖 (鎖的重量依次加重)
偏向鎖 實現是在 先確認偏向鎖標識是可獲得狀態,第一次獲取到鎖的時候,將對象的 mark word 中的偏向鎖線程的標識為自己,下一次進入到同步塊的時候,直接獲取鎖。當有其他線程競爭鎖的時候,發現 markword 并不是自己,會嘗試進行一次 cas 替換,如果不成功,就會將鎖升級為輕量級鎖 消耗:極少
輕量級鎖 實現:在執行同步塊之前,jvm 會先在當前線程的棧幀中創建用于存儲所鎖記錄的空間,并將對象頭中 markWord 復制到鎖記錄中,。然后線程嘗試使用 cas 將對象頭中的 mark word 替換為指向鎖記錄的指針,如果成功,當前線程獲得鎖,如果失敗,說明以有競爭,當前線程會使用自旋來獲取鎖。自旋獲取鎖失敗,會將對象頭的鎖標識改為重量級指針。解鎖的時候,會使用原子 Cas 操作將 Displaced Mark Word 替換為對象頭,成功說明沒有發生競爭, 如果失敗,說明當前鎖存在競爭,鎖會膨脹為重量級鎖。
消耗:復制和自旋
重量級鎖:
Synchronized是通過對象內部的一個叫做監視器鎖(monitor)來實現的。但是監視器鎖本質又是依賴于底層的操作系統的Mutex Lock來實現的。而操作系統實現線程之間的切換這就需要從用戶態轉換到核心態,這個成本非常高,狀態之間的轉換需要相對比較長的時間,這就是為什么Synchronized效率低的原因。因此,這種依賴于操作系統Mutex Lock所實現的鎖我們稱之為“重量級鎖”。JDK中對Synchronized做的種種優化,其核心都是為了減少這種重量級鎖的使用。JDK1.6以后,為了減少獲得鎖和釋放鎖所帶來的性能消耗,提高性能,引入了“輕量級鎖”和“偏向鎖”。
reentrantLock 的實現:
reentrantLock基于 AQS 實現。AQS 內部通過對 volatile 的 state 讀寫以及cas 操作 和在某些條件下讓線程進入阻塞狀態實現。
volatile 消耗小于 synchronized ,reentrantLock 中某些條件下讓線程進入阻塞狀態 的消耗 可能與 synchronized 相當。
因此 性能 偏向鎖 > 輕量級鎖 > reentrantLock > synchronized
而偏向鎖 和輕量級鎖 能夠啟用是在特殊條件下的。
總結
以上是生活随笔為你收集整理的reentrantLock 和 synchronized 哪个性能高?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何异地加载 Spring Boot 配
- 下一篇: SpringSecurity-短信验证码