17 自旋鎖和自適應自旋鎖有什麼區別

自旋鎖的概念: 阻塞或喚醒一個java線程需要操作系統切換cpu狀態來完成,這種狀態裝換需要耗費處理器的時間。如果同步代碼塊中的內容過於簡單,狀態轉換消耗的時間有可能比用戶執行代碼的時間還要長。 在許多場景下,同步資源的鎖定時間較短,爲了這一小段時間去切換線程,線程掛起和恢復線程花費可能會讓系統得不償失。如果物理機器有多個處理器,能讓2個或者多個線程同時並行執行。我們可以讓後面那個請求鎖的線程不放棄cpu的執行時間,看看持有鎖的線程是否會很快就會釋放鎖。 而爲了讓當前線程 "稍等一下",我們需要讓當前線程鎖自旋,如果在自旋完成後前面鎖定同步資源的線程已經釋放了鎖,那麼當前線程不必阻塞而是直接獲取同步資源,從而避免切換線程的開銷。這就是自旋鎖。 自旋鎖的缺點: 自旋鎖本身是有缺點的,他不能代替阻塞,自旋等待雖然避免了線程切換的開銷,但是他要佔用cpu處理器的時間,如果鎖被佔用的時間很短,自旋等待的效果就會非常好。反之,如果鎖被佔用的時間很長,那麼自旋的線程只會白浪費處理器的資源。所以,自旋等待的時間必須要有一定的限度,如果自旋超過了限定次數(默認是10次,可以用 -XX:PreBlockSpin來更改)沒有成功獲得鎖,就應該掛起線程。自旋鎖的原理同樣也是cas。 適應性自旋鎖:自適應意味着自旋的時間(次數)不在固定,而是由前一次在同一個鎖上的自旋時間以及鎖的擁有者的狀態來決定。如果在同一個鎖對象上,自旋等待剛剛成功獲得過鎖,並且持有鎖的線程正在執行中,那麼虛擬機就會認爲這次自旋也是很有可能再次成功,進而他講允許自旋等待的持續相對更長的時間。如果對於某個鎖,自旋很少成功獲得過,那子啊以後嘗試獲取這個鎖時將可能省略自旋過程,直接阻塞線程,避免浪費處理器資源。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章