從synchronized中看鎖的優化

本文是學習《深入理解JAVA虛擬機》的第6篇筆記

樂觀鎖、悲觀鎖做技術基本都聽過。JAVA中鎖的實現,用的最多的是synchronized,這是重量級鎖,爲提高性能,做了很多優化,今天就說說這個加鎖的過程。

之前的文章寫對象的內存佈局時,說過對象頭,鎖的實現跟這個有很大的關係。不太瞭解這塊的可以先熟悉下。《對象內存佈局》。

線程的阻塞、掛起與喚醒都需要切換至內核態,這幾個操作都是很消耗內存的。synchronized的實現並不是一開始就上重量級鎖,它有一個鎖升級的過程,這裏先從偏向鎖說起。

// Bit-format of an object header (most significant first, big endian layout below):
//
//  32 bits:
//  --------
//             hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//             JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
//             size:32 ------------------------------------------>| (CMS free block)
//             PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)
//
//  64 bits:
//  --------
//  unused:25 hash:31 -->| unused:1   age:4    biased_lock:1 lock:2 (normal object)
//  JavaThread*:54 epoch:2 unused:1   age:4    biased_lock:1 lock:2 (biased object)
//  PromotedObject*:61 --------------------->| promo_bits:3 ----->| (CMS promoted object)
//  size:64 ----------------------------------------------------->| (CMS free block)
//
//  unused:25 hash:31 -->| cms_free:1 age:4    biased_lock:1 lock:2 (COOPs && normal object)
//  JavaThread*:54 epoch:2 cms_free:1 age:4    biased_lock:1 lock:2 (COOPs && biased object)
//  narrowOop:32 unused:24 cms_free:1 unused:4 promo_bits:3 ----->| (COOPs && CMS promoted object)
//  unused:21 size:35 -->| cms_free:1 unused:7 ------------------>| (COOPs && CMS free block)

偏向鎖

64位的虛擬機,對象頭是64bit。最後兩位是鎖狀態,倒數第3位,是偏向鎖鎖狀態,1表示加了偏向鎖,0代表沒有。
當被鎖的對象,第一次被線程獲取時,虛擬機將的對象的鎖標誌位設置成01,將此線程ID,通過CAS操作,記錄到對象頭中,如果成功,偏向鎖的標記位就是1。之後該線程每次進入這個鎖相關的同步塊時,虛擬機不會進行任何別的操作(Locking, Unlocking,對象頭的Update等等)
如果此時另外一個線程請求這個鎖,撤消偏向鎖,升級爲輕量級鎖。
在這裏插入圖片描述
輕量級鎖

輕量級鎖的標記位是00,線程棧中將對象頭記住記錄下來,就是Lock Record空間。哪個線程把自己的Lock Record指針寫到被鎖對象的對象頭中,哪個線程就擁有這個鎖。
在這裏插入圖片描述

重量級鎖
如果此時別的線程訪問被鎖的對象,那就開始自旋。競爭加劇,也就是自旋的線程多了,輕量級鎖發生鎖膨脹,升級爲重量級鎖。也就是說由用戶態切換到內核態。鎖標記位是10,沒拿到鎖的線程阻塞等待。

加鎖,指的是鎖定對象

鎖升級的過程

JDK較早的版本 :OS的資源 互斥量 用戶態 -> 內核態的轉換 重量級 效率比較低

現代版本進行了優化:無鎖 - 偏向鎖 -輕量級鎖(自旋鎖)-重量級鎖

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