jvm隨筆9 鎖優化

2021-09-11 06:33:55 字數 1226 閱讀 4811

1.自旋鎖

問題:掛起和恢復執行緒要轉入核心態中完成,許多應用,共享資料的鎖定狀態只會持續很短一段時間,為了這段時間去掛起和恢復執行緒並不值得。

兩個或以上的執行緒並行執行時,可以讓後面請求鎖的那個執行緒等一下,但不放棄處理器的執行時間,看看持有鎖的執行緒是否很快就會釋放鎖。為了讓執行緒等待,只需讓執行緒執行乙個忙迴圈(自旋),避免了執行緒切換的開銷

2.鎖消除

虛擬機器即時編譯器在執行時,對一些**要求同步,但是被檢測到不可能存在共享資料競爭的鎖進行消除

3.鎖粗化

問題:如果一系列的連續操作都對乙個物件反覆加鎖和解鎖,甚至加鎖操作是出現在迴圈體中,那麼即使沒有執行緒競爭,頻繁的進行互斥同步操作也會導致不必要的效能損耗。

如果虛擬機器探測到有這樣一串零碎的操作都對同乙個物件加鎖,將會把加鎖同步的範圍粗化到整個操作序列的外部

4.輕量級鎖

輕量級是相對於使用作業系統互斥量來實現的傳統鎖而言,傳統鎖機制被稱為重量級鎖,輕量級鎖並不是用來代替傳統的重量級鎖的,他的本意是在沒有多執行緒競爭的前提下,較少傳統重量級鎖使用作業系統互斥量產生的效能消耗

1)物件頭

物件頭資訊是與物件自身定義的資料無關的額外儲存成本

2)輕量級鎖

**進入同步快時,如果此同步物件沒有鎖定(鎖標誌位為01狀態),虛擬機器將在當前執行緒的棧幀中建立乙個名為鎖記錄的空間,用於儲存鎖物件目前mark word的拷貝。

虛擬機器使用cas操作嘗試將物件的mark word 更新為指向lock record的指標,如果這個更新操作成功了,這個執行緒就擁有了該物件的鎖,並且物件mark word 的鎖標誌位轉變為 00,表示處於輕量級鎖狀態。

如果有兩條以上的執行緒爭用同乙個鎖,那輕量級鎖就不再有效,要膨脹為重量級鎖,鎖標誌狀態位 變為 10

如何提公升效能:對於絕大部分鎖,在整個同步週期內都是不存在競爭的。如果沒有競爭,輕量級鎖使用cas操作避免了使用互斥量的開銷

5.偏向鎖

消除資料在無競爭情況下的同步原語,不同於輕量級鎖是在無競爭情況下使用cas操作去消除同步使用的互斥量,那偏向鎖就是在無競爭的情況下把整個同步都消除掉,連cas都不做。

偏向鎖的意思是這個鎖會偏向第乙個獲得它的執行緒,如果在接下來的執行過程中,該鎖沒有被其他執行緒獲取,則持有偏向鎖的執行緒不需要再進行同步。

JVM對鎖的優化

作為一款公用的平台,jdk肯定也對併發程式的效能絞盡腦汁,內部也想盡一切辦法來提高併發時候的吞吐量。下面介紹幾種jdk內部的鎖優化策略 一.鎖偏向 二.輕量級鎖 如果偏向鎖失敗,虛擬機器並不會立即掛起執行緒,它還會使用一種稱為輕量級鎖的優化手段。輕量級鎖的操作也很輕便,它只是簡單的將物件的頭部作為指...

JVM鎖優化以及區別

偏向所鎖,輕量級鎖都是樂觀鎖,重量級鎖是悲觀鎖。首先簡單說下先偏向鎖 輕量級鎖 重量級鎖三者各自的應用場景 還要明確的是,偏向鎖 輕量級鎖都是jvm引入的鎖優化手段,目的是降低執行緒同步的開銷。比如以下的同步 塊 synchronized lockobject 上述同步 塊中存在乙個臨界區,假設當前...

JVM學習(九) 鎖優化

1 高效併發是jdk1.5到jdk1.6的乙個重要改進,出現了適應性自旋 adaptive spinning 鎖消除 lock elimination 鎖粗化 lock coarsening 輕量級鎖 lightweight locking 和偏向鎖 biased locking 等一系列鎖優化技術...