JVM鎖優化總結
自旋鎖
適用場景:
適用於多cpu
前提:
a. 掛起先撤和恢復執行緒的操作需要轉入核心態完成,這種操作給系統性能帶來很大壓力b. 由與執行緒鎖定狀態一般很短,為了很短的一段時間掛起執行緒和恢復執行緒不值得
做法:
在一個執行緒鎖定時,讓後來的執行緒在另一個cpu上稍等一下,單不放棄cpu的執行時間,等待另一個執行緒釋放鎖
消除鎖
概念:
對一些程式碼上要求同步,但是檢測到不存在共享資料競爭的鎖進行消除
粗化鎖
概念:
如果一系列的操作對同一個物件反覆加鎖解鎖,粗化鎖就是把加鎖同步範圍擴大到操作序列的外部,將操作序列的多次加鎖解鎖變為一次加鎖解鎖
輕量級鎖
概念:
執行緒在進入同步塊時,線上程當前棧幀中建立鎖記錄,通過CAS操作和鎖物件的物件頭交換說句,也就是說,物件頭存的資料是指向執行緒棧幀中的鎖記錄的指標,且物件頭標誌位為00,執行緒棧幀中所記錄存的是鎖物件頭的拷貝;解鎖過程也是通過CAS實現的逆過程
前提:
傳統說又成為重量級鎖,是通過使用作業系統互斥量實現的,效能消耗大;對於絕大部分的鎖,真個同步週期內都是不存在競爭的,這是一個經驗資料
存在意義:
輕量級鎖並不是用來代替重量級鎖的,它的本意是在沒有多執行緒競爭的前提下減少重量級鎖使用作業系統互斥量產生的效能消耗
膨脹:
如果存在多個執行緒競爭同一個鎖,那麼輕量級鎖不在有效,要彭長為重量級鎖,所標誌變為10,物件頭存的是指向重量級鎖(互斥量)的指標,後面等待的執行緒叫進入阻塞狀態
缺點:
如果膨脹為重量級鎖,因為存在額外的CAS操作,輕量級鎖會比傳統的重量級鎖還要慢!
偏向鎖
概念:
如果當前虛擬機器啟用了片仙姑搜,那麼,當鎖物件被執行緒第一次獲取時,虛擬機器將會把物件頭中的標誌位更新為01,即偏向模式。同時使用CAS操作把獲取到這個鎖的執行緒ID記錄到物件的物件頭中,如果CAS操作成功,持有偏向鎖的執行緒以後每次進入這個所相關的同步塊是,虛擬機器都可以不進行任何同步操作。
膨脹:
當有另一個執行緒嘗試獲取這個所時,偏向模式就宣告結束。根據鎖物件目前是否處於被鎖定狀態,撤銷偏向後恢復到未鎖定狀態或輕量級鎖定狀態。