從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),重量級鎖則是除了擁有鎖的線程其他全部阻塞。
