Java性能優化-2

synchronized鎖實現
當多個線程訪問同一段代碼時,會被先放到EntryList集合中,處於block的線程也會被加入該列表
接下來當線程獲取到對象的Monitor時,是依靠底層操作系統的Mutex Lock來實現互斥的,也就是說會發生用戶態->內核態的切換,線程申請Mutex成功,持有Mutex,其他線程無法獲取到Mutex
如果調用wait(),就會釋放持有的Mutext,該線程會進入WaitSet集合中

JDK1.6之後對鎖進行優化,引入了 偏向鎖,輕量級鎖,重量級鎖
下圖是Java對象頭的構成,鎖升級功能主要依賴Mark Word中鎖標誌位和釋放偏向所標誌位


synchronized同步鎖是從偏向鎖開始,隨着競爭激烈升級到輕量級鎖,再到重量級鎖
偏向鎖,當一個線程反覆獲取鎖時,爲避免頻繁出現用戶態到內核態的切換,還需要判斷對象頭是否持有鎖標記,也就是搶到的鎖持有的線程ID是否是自己的,如果是則進入偏向鎖狀態

如果出現多線程競爭,偏向鎖會撤銷,進入輕量級鎖
這種就是CAS自旋,如果超過一定次數次數後,就變成重量級鎖
在競爭不激烈,鎖佔用時間非常短的情況下,自旋鎖可以提高系統性能,如果競爭非常激烈CAS反而會佔用資源
可以通過JVM啓動參數,取消偏向鎖,自旋鎖

還可以通過減小鎖的粒度,還優化性能,比較典型的是集合類中的  ConcurrentHashMap

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章