日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

reentrantLock 和 synchronized 哪个性能高?

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

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

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

synchronized 底層實現(xiàn)由jvm 保證,

在jvm 運行過程中,可能出現(xiàn) 偏向鎖,輕量級鎖,重量級鎖 (鎖的重量依次加重)

偏向鎖 實現(xiàn)是在 先確認偏向鎖標識是可獲得狀態(tài),第一次獲取到鎖的時候,將對象的 mark word 中的偏向鎖線程的標識為自己,下一次進入到同步塊的時候,直接獲取鎖。當有其他線程競爭鎖的時候,發(fā)現(xiàn) markword 并不是自己,會嘗試進行一次 cas 替換,如果不成功,就會將鎖升級為輕量級鎖 消耗:極少

輕量級鎖 實現(xiàn):在執(zhí)行同步塊之前,jvm 會先在當前線程的棧幀中創(chuàng)建用于存儲所鎖記錄的空間,并將對象頭中 markWord 復制到鎖記錄中,。然后線程嘗試使用 cas 將對象頭中的 mark word 替換為指向鎖記錄的指針,如果成功,當前線程獲得鎖,如果失敗,說明以有競爭,當前線程會使用自旋來獲取鎖。自旋獲取鎖失敗,會將對象頭的鎖標識改為重量級指針。解鎖的時候,會使用原子 Cas 操作將 Displaced Mark Word 替換為對象頭,成功說明沒有發(fā)生競爭, 如果失敗,說明當前鎖存在競爭,鎖會膨脹為重量級鎖。

消耗:復制和自旋

重量級鎖:

Synchronized是通過對象內(nèi)部的一個叫做監(jiān)視器鎖(monitor)來實現(xiàn)的。但是監(jiān)視器鎖本質(zhì)又是依賴于底層的操作系統(tǒng)的Mutex Lock來實現(xiàn)的。而操作系統(tǒng)實現(xiàn)線程之間的切換這就需要從用戶態(tài)轉(zhuǎn)換到核心態(tài),這個成本非常高,狀態(tài)之間的轉(zhuǎn)換需要相對比較長的時間,這就是為什么Synchronized效率低的原因。因此,這種依賴于操作系統(tǒng)Mutex Lock所實現(xiàn)的鎖我們稱之為“重量級鎖”。JDK中對Synchronized做的種種優(yōu)化,其核心都是為了減少這種重量級鎖的使用。JDK1.6以后,為了減少獲得鎖和釋放鎖所帶來的性能消耗,提高性能,引入了“輕量級鎖”和“偏向鎖”。

reentrantLock 的實現(xiàn):

reentrantLock基于 AQS 實現(xiàn)。AQS 內(nèi)部通過對 volatile 的 state 讀寫以及cas 操作 和在某些條件下讓線程進入阻塞狀態(tài)實現(xiàn)。

volatile 消耗小于 synchronized ,reentrantLock 中某些條件下讓線程進入阻塞狀態(tài) 的消耗 可能與 synchronized 相當。

因此 性能 偏向鎖 > 輕量級鎖 > reentrantLock > synchronized

而偏向鎖 和輕量級鎖 能夠啟用是在特殊條件下的。

總結(jié)

以上是生活随笔為你收集整理的reentrantLock 和 synchronized 哪个性能高?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。