看到這裡,你應該明白了「為什麼synchronized(…)中只能傳物件,不能傳基礎資料型別?」(基礎資料型別不是物件,沒有物件頭,也就沒有鎖資訊)
tips:建議對著markword結構圖看
—> 執行緒a再次獲取鎖,因為是偏向鎖,所以非常快
—> 執行緒a執行一會兒後,退出了同步**塊
—> 執行緒b過來獲取鎖,因為鎖記錄的偏向執行緒id是執行緒a,所以進行cas修改會失敗,此時會暫停(安全點)原偏向執行緒a並檢測線程a的狀態。因為a之前已退出同步**塊,此時需要執行緒a釋放鎖(即修改鎖物件為無鎖狀態)。
—> 一會兒後,執行緒b拿到了偏向鎖
—> —> 執行緒c開始過來搶鎖,判斷鎖的偏向執行緒,顯然cas修改會失敗,同時,若執行緒b仍然存活(未退出同步**塊),原偏向執行緒b會將[偏向鎖]將公升級為[輕量級鎖]
—> —> 執行緒c持續進行cas自旋獲取執行權(即替換 markword 的 lockrecord 指標),如果成功,獲得輕量級鎖(cas自旋存在cpu空轉問題)
—> —> —> 如果執行緒c持續進行cas自旋超過n次(早期版本是 -xx:preblockspin=10,新的是自適應自旋次數),[輕量級鎖]將公升級為[重量級鎖]
關於膨脹流程,部落格dreamtobe有乙份示意圖如下
因此,不能認為較輕的鎖(偏向鎖、輕量級鎖)效能就一定好,應該根據情況達到乙個合適的點
jvm引數
JVM對鎖的優化
作為一款公用的平台,jdk肯定也對併發程式的效能絞盡腦汁,內部也想盡一切辦法來提高併發時候的吞吐量。下面介紹幾種jdk內部的鎖優化策略 一.鎖偏向 二.輕量級鎖 如果偏向鎖失敗,虛擬機器並不會立即掛起執行緒,它還會使用一種稱為輕量級鎖的優化手段。輕量級鎖的操作也很輕便,它只是簡單的將物件的頭部作為指...
jvm對鎖的優化
jvm對鎖 sychornized 的優化開始於jdk1.6。優化的方面主要技術包括 自旋鎖 自適應自旋鎖 偏向鎖 鎖銷除 鎖粗話,輕量級鎖,重量級鎖 1自旋鎖 在鎖爭用不多 鎖占用時間比較少的情況下,自旋鎖讓執行緒去迴圈獲取鎖,這比執行緒阻塞性能更好 包括掛起或喚醒 自旋鎖預設自旋的次數是10次,...
volatile和synchronized的區別
關於可見性的問題 可見性 即當讀寫兩個執行緒同時訪問同乙個變數時,用於確保寫執行緒更新變數後,讀執行緒再訪問該 變數時可以讀取到該變數最新的值。volatile和synchronized的區別 1.volatile本質是在告訴jvm當前變數在暫存器 工作記憶體 中的值是不確定的,需要從主存中讀取 s...