Java中鎖的優(yōu)化機制了解嗎?

從JDK1.6版本之后,synchronized本身也在不斷優(yōu)化鎖的機制,有些情況下他并不會是?個很重量級的鎖了。優(yōu)化機制包括?適應(yīng)鎖、?旋鎖、鎖消除、鎖粗化、輕量級鎖和偏向鎖。

鎖的狀態(tài)從低到?依次為?鎖->偏向鎖->輕量級鎖->重量級鎖,升級的過程就是從低到?,降級在?定條件也是有可能發(fā)?的。

?旋鎖:由于?部分時候,鎖被占?的時間很短,共享變量的鎖定時間也很短,所有沒有必要掛起線程,?戶態(tài)和內(nèi)核態(tài)的來回上下?切換嚴重影響性能。?旋的概念就是讓線程執(zhí)??個忙循環(huán),可以理解為就是啥也不?,防?從?戶態(tài)轉(zhuǎn)?內(nèi)核態(tài),?旋鎖可以通過設(shè)置-XX:+UseSpining來開啟,?旋的默認次數(shù)是10次,可以使?-XX:PreBlockSpin設(shè)置。

?適應(yīng)鎖:?適應(yīng)鎖就是?適應(yīng)的?旋鎖,?旋的時間不是固定時間,?是由前?次在同?個鎖上的?旋時間和鎖的持有者狀態(tài)來決定。

鎖消除:鎖消除指的是JVM檢測到?些同步的代碼塊,完全不存在數(shù)據(jù)競爭的場景,也就是不需要加鎖,就會進?鎖消除。

鎖粗化:鎖粗化指的是有很多操作都是對同?個對象進?加鎖,就會把鎖的同步范圍擴展到整個操作序列之外。

偏向鎖:當線程訪問同步塊獲取鎖時,會在對象頭和棧幀中的鎖記錄?存儲偏向鎖的線程ID,之后這個線程再次進?同步塊時都不需要CAS來加鎖和解鎖了,偏向鎖會永遠偏向第?個獲得鎖的線程,如果后續(xù)沒有其他線程獲得過這個鎖,持有鎖的線程就永遠不需要進?同步,反之,當有其他線程競爭偏向鎖時,持有偏向鎖的線程就會釋放偏向鎖??梢?過設(shè)置-XX:+UseBiasedLocking開啟偏向鎖。

輕量級鎖:JVM的對象的對象頭中包含有?些鎖的標志位,代碼進?同步塊的時候,JVM將會使?CAS?

式來嘗試獲取鎖,如果更新成功則會把對象頭中的狀態(tài)位標記為輕量級鎖,如果更新失敗,當前線程就

嘗試?旋來獲得鎖。

整個鎖升級的過程?常復(fù)雜,我盡?去除?些??的環(huán)節(jié),簡單來描述整個升級的機制。

簡單點說,偏向鎖就是通過對象頭的偏向線程ID來對?,甚?都不需要CAS了,?輕量級鎖主要就是通

過CAS修改對象頭鎖記錄和?旋來實現(xiàn),重量級鎖則是除了擁有鎖的線程其他全部阻塞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容