若是你不想平庸,就請勿中止前進的腳步。一樣做爲主流的開發語言,Java也沒有中止前進,而是一直在優化進步。更多內容請搜索關注微信公衆號:Different Java微信
synchronized Lock在JDK1.6以前效率低下,緣由咱們已經在悲觀鎖中講述過了,所以爲了提升鎖的效率,JVM對其進行了優化。優化
鎖優化的過程也是鎖狀態變動的過程,鎖的狀態目前有如下幾種:spa
鎖的狀態是如何標記的,這就須要藉助Java對象在內存中的存儲格式。Java對象在虛擬機中大體分爲三部分:操作系統
對象頭中存儲對象自身運行時的數據(Mark Word)以及類型指針,而鎖的狀態則保存在Mark Word中。 因爲鎖狀態的不一樣,Mark Word也會不相同。各類鎖狀態下的Mark Word(32位 JVM)以下:線程
若是一個線程得到了鎖,那麼鎖就進入偏向模式,此時對象的Mark Word也會進入偏向鎖模式,當該線程再次請求鎖無需執行獲取鎖操做,省去了大量獲取鎖的時間。對於競爭不激烈的場合偏向鎖的提高效果仍是很明顯的,可是競爭激烈的場合建議關閉偏向鎖,能夠使用-XX:-UseBiasedLocking此參數關閉偏向鎖。3d
偏向鎖的鎖定和撤銷的簡要步驟以下:指針
當偏向鎖失敗時,虛擬機不會當即掛起線程。它會將對象頭部做爲指針,指向持有鎖的線程堆棧內部,來判斷一個線程是否持有對象鎖。若是成功,則能夠進入臨界區,失敗之後會膨脹爲重量級鎖,可是膨脹後,虛擬機還會作最後一次努力優化,那就是自旋鎖。對象
輕量級鎖膨脹重量級鎖的簡要步驟以下:token
因爲當前線程暫時沒法得到鎖,但什麼時候獲取也是未知的。有可能在幾個CPU時鐘週期後即可獲得鎖,此時虛擬機或進行一次賭注,會讓當前線程作幾個空循環,在通過若干次循環後若是能夠獲得鎖便進入臨界區,若是不能得到鎖,則將線程真正從操做系統層面掛起。內存
鎖只能升級不能降級,鎖升級的詳細步驟以下:
鎖消除是JVM運行時經過JIT編譯來發現不可能存在共享資源競爭的鎖,而後將其消除(消除的關鍵是要藉助逃逸分析),節省無心義的請求時間。
本期的Java鎖優化就介紹到這,我是shysh95,咱們下期再見!