日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

reentrantLock 和 synchronized 哪个性能高?

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 reentrantLock 和 synchronized 哪个性能高? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??點擊上方?好好學java?,選擇?星標?公眾號

重磅資訊、干貨,第一時間送達 今日推薦:一個線程池 bug 引發的 GC 思考!個人原創+1博客:點擊前往,查看更多 鏈接:https://segmentfault.com/a/1190000022041809

synchronized 底層實現由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 哪个性能高?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。