1. 程式人生 > 其它 >Java 鎖優化

Java 鎖優化

一、鎖優化技術

  JDK5之後,在多執行緒併發上實現了很多鎖優化技術,分別是自適應自旋鎖、鎖消除、鎖膨脹、輕量級鎖、偏向鎖。

二、自適應的自旋鎖

  自旋鎖是其他執行緒獲取持有鎖的執行緒的鎖時,讓嘗試獲取鎖的執行緒“忙迴圈”一會,等待持有鎖的執行緒釋放鎖。如果,在忙迴圈結束後,執行緒依然獲取不到鎖,執行緒進入堵塞等待。在JDK4中預設的忙迴圈次數是10次,當然可以通過編譯器引數修改忙迴圈次數。但是,這樣設定自旋鎖的忙迴圈次數是固定的。在JDK6中對自旋鎖進行了優化,就是自適應的自旋鎖。

  自適應的自旋鎖是假設上次執行緒獲取鎖成功,這次也會成功,自旋鎖讓執行緒本次忙迴圈次數增加。如果,執行緒上次獲取鎖失敗,執行緒本次省略忙迴圈,直接跳過,執行緒進入堵塞等待,這就是自適應的自旋鎖。

  雖然,自旋鎖讓執行緒忙迴圈,節省了使用者態和核心態的狀態切換,忙迴圈依然佔用處理器執行時間。執行緒短時間的自旋等待後獲取鎖的效率比執行緒堵塞等待高效一些,但是,長時間的自旋等待佔用處理器執行時間也越多了,效率反而不高了。

三、鎖消除

  鎖消除是指Java虛擬機器的即使編譯器在執行時,檢測需要同步的程式碼,檢測到同步程式碼的共享資料的鎖不存在被競爭,將同步程式碼的共享資料的鎖消除。

四、鎖膨脹

  在一段程式碼上,程式碼分段加鎖,需要頻繁的加鎖和解鎖,這樣也會有不必要的效能消耗,此時將分段加鎖的程式碼統一加鎖一次,減少頻繁加鎖和解鎖。

五、輕量級鎖

六、偏向鎖