jvm對鎖的優化

2022-09-10 07:09:10 字數 1279 閱讀 3572

jvm對鎖(sychornized)的優化開始於jdk1.6。優化的方面主要技術包括:自旋鎖、自適應自旋鎖、偏向鎖、鎖銷除、鎖粗話,輕量級鎖,重量級鎖

1自旋鎖:在鎖爭用不多、鎖占用時間比較少的情況下,自旋鎖讓執行緒去迴圈獲取鎖,這比執行緒阻塞性能更好(包括掛起或喚醒)。自旋鎖預設自旋的次數是10次,可以通過jvm引數-xx:preblockspin配置,

2自適應自旋鎖:自適應自旋鎖是基於自旋鎖的優化,自旋鎖會讓執行緒去不斷迴圈嘗試獲取鎖,但如果某乙個執行緒獲取到鎖的時間特別長(比阻塞的效能都低)這時候自旋鎖的效果就不行了,從而自適應自旋鎖應運而生。自適應自旋鎖在獲取鎖失敗後,會根據前面獲取同樣的鎖的執行緒獲取鎖的時間來判斷等待的處理方式去進行鎖等待。自適應自旋的次數由前一次在同乙個鎖上的自旋次數和鎖的擁有者的狀態來決定。如果前面執行緒成功獲取鎖並且正常執行,那麼本次獲取鎖的可能性很大,所以自旋的次數相對多一些;如果前面執行緒很少成功獲取鎖,那麼本次獲取鎖的概率也很小,就可能不執行自旋。

3偏向鎖:偏向鎖是在沒有鎖競爭的時候產生的,換句話就是只會有乙個執行緒去獲取鎖,一旦有執行緒來競爭鎖,偏向鎖就不存在了。它的目標是減少無競爭的情況下,減少輕量級鎖帶來的資源消耗。(輕量級鎖每次獲取都會有一次cas操作,偏向鎖只有在初始化的受操作一次cas)

4鎖消除:鎖消除是指虛擬機器在分析不存在共享資料需要競爭獲取的情況下(如:物件變數)會將鎖去除,提公升執行效率。

5鎖粗話:是指同一執行緒內會對同乙個物件進行多次獲取鎖時,會將鎖的範圍擴大至第一此次獲取鎖的開始位置,到最後一次釋放鎖的位置。

6輕量級鎖:輕量級鎖是針對重量級鎖的乙個相對的概念,它的目標是減少無實際競爭情況下,使用重量級鎖產生的效能消耗。輕量級鎖不會申請互斥量(避免了損耗),它僅僅是將物件頭里的鎖標誌位改為00。輕量級鎖在經過一定次數的獲取後會公升級為重量級鎖。

7重量級鎖:記憶體鎖一般在j**a中被抽象為監視器(monitor)鎖,監視器鎖一般直接對應的是作業系統的互斥量(mutex),這種鎖的成本非常高,包括系統呼叫引起的核心態和使用者態的切換以及執行緒阻塞喚醒,後來這種鎖被稱為重量級鎖。

物件頭的mark wold的內容:

補充(物件的內容包含物件頭、例項資料和對齊填充)

注意:1鎖膨脹(公升級)的過程為:偏向鎖->輕量級鎖->重量級鎖.  

2自旋鎖和自適應自旋鎖是可以理解為判斷鎖膨脹過程中的手段。當有其他執行緒會競爭鎖時(占用鎖的時間比較短),會通過自選鎖去獲取鎖,這時鎖會變為輕量級鎖,如果超過一定時間,會再次公升級為重量級鎖;如果通過自適應自旋鎖判斷獲取鎖的時間比較長就會直接將鎖公升級為重量級鎖。

JVM對鎖的優化

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

JVM對synchronized的優化 鎖膨脹

看到這裡,你應該明白了 為什麼synchronized 中只能傳物件,不能傳基礎資料型別?基礎資料型別不是物件,沒有物件頭,也就沒有鎖資訊 tips 建議對著markword結構圖看 執行緒a再次獲取鎖,因為是偏向鎖,所以非常快 執行緒a執行一會兒後,退出了同步 塊 執行緒b過來獲取鎖,因為鎖記錄的...

說一說 JVM 對鎖的優化

jdk 1.6 對併發性進行了很大的改進,這也是為了使執行緒之間更好更高效地共享資料,解決競爭問題,實現執行緒安全。因此從 jdk 1.6 開始,實現了很多鎖的優化技術。講正題之前,先說一下 reentrantlock 和 synchronized 這對冤家,我們經常會拿這兩個鎖作比較,其中乙個是顯...