JVM對鎖的優化

2021-08-21 18:19:40 字數 870 閱讀 9413

作為一款公用的平台,jdk肯定也對併發程式的效能絞盡腦汁,內部也想盡一切辦法來提高併發時候的吞吐量。下面介紹幾種jdk內部的鎖優化策略

一.鎖偏向

二.輕量級鎖

如果偏向鎖失敗,虛擬機器並不會立即掛起執行緒,它還會使用一種稱為輕量級鎖的優化手段。輕量級鎖的操作也很輕便,它只是簡單的將物件的頭部作為指標,指向持有鎖的執行緒堆疊的內部,來判斷乙個執行緒是否持有物件鎖。如果執行緒獲得輕量級鎖成功,則可以順利進入臨界區。如果輕量級加鎖失敗,則表示其他執行緒搶先爭奪到了鎖,那麼當前執行緒的鎖請求就會自我膨脹為重量級鎖

三.自旋鎖

鎖膨脹以後,虛擬機器為了避免線**實地在作業系統層面掛起,虛擬機器還會在做最後的努力--自旋鎖。由於執行緒暫時無法獲得鎖,但是什麼時候可以獲得鎖還是個未知數。系統會假設,在不久的將來,該執行緒會獲得鎖,因此,虛擬機會讓執行緒進行空迴圈,在經過若干次的迴圈後,如果可以得到鎖,那麼就順利進入臨界區。如果還不能獲得鎖,才會真實地將執行緒在作業系統層面掛起。

四.鎖消除

鎖消除,顧名思義,就是在沒有競爭的情況下將鎖消除掉,不加鎖。那麼可能你會有個疑問,既然不存在競爭那麼為什麼要加鎖。我們開發的時候,必然會用到jdk的api。比如,stringbuffer、vector等。在使用這些類的時候,也許根本就不會考慮這些物件到底內部是如何實現的。比如,很可能在乙個不存在併發的競爭場合使用vector。vector內部使用到了synchronized請求鎖。

public string createstrings()

return v.toarray(new string{});

}

這就涉及到乙個關鍵的技術-逃逸分析。所謂逃逸分析就是觀察某乙個變數是否會逃出某乙個作用域而被其他的執行緒修改。本例中,很明顯沒有逃離出去,所以就大膽的將鎖消除掉。

jvm對鎖的優化

jvm對鎖 sychornized 的優化開始於jdk1.6。優化的方面主要技術包括 自旋鎖 自適應自旋鎖 偏向鎖 鎖銷除 鎖粗話,輕量級鎖,重量級鎖 1自旋鎖 在鎖爭用不多 鎖占用時間比較少的情況下,自旋鎖讓執行緒去迴圈獲取鎖,這比執行緒阻塞性能更好 包括掛起或喚醒 自旋鎖預設自旋的次數是10次,...

JVM對synchronized的優化 鎖膨脹

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

說一說 JVM 對鎖的優化

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