Syncronized之自適應自旋鎖


  首先介紹兩個朋友,第一位是“佩奇”同學,非常樂於思考,經常提問題,第二位是“小智”同學,聰明絕頂,樂於解答問題。

  java中線程的切換是線程從用戶態(jvm層)到內核態(操作系統層)的轉換,代價比較大。對於執行時間很短的任務,可能任務執行的時間還沒有線程切換的時間長,為了這段時間去掛起和恢復線程非常不值得,如果通過自旋的方式(即嘗試讓當前線程空轉,等待一段時間但不放棄處理器的執行時間)可以獲取到鎖,就可以避免線程的切換,從而減少並發的壓力。

佩奇:為什么任務執行時間比較長的任務不適合使用自旋鎖?
小智:自旋是通過循環的方式進行空轉,對於任務執行比較長的任務,空轉的這段時間就白白浪費了cpu資源。

  由於無法確定任務具體執行的時間,空轉次數也就無法確定,很難去確定一個准確的自旋周期,JDK1.6后引入了一個自適應自旋鎖,圖示如下:

  

   ① 當線程T1嘗試獲取鎖時,發現已經被T2線程占用,就執行自旋。

   ② T1自旋了一段時間后獲得了這把鎖,就開始執行任務。 

   ③ T3線程競爭鎖時發現剛剛的T1線程通過自旋獲得過鎖,並且持有鎖的線程正在執行(不一定是T1線程),那么就認為下次通過自旋的方式也可以獲得鎖,就會自旋更長的時間;如果自旋很少成功獲得過,那么下次就會忽略掉自旋過程,以免浪費處理器資源。

  有了自適應自旋,虛擬機對程序鎖的狀態預測就會越來越准確,虛擬機就會變得越來越“聰明”了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM