Java自旋鎖

參考:https://blog.csdn.net/fuyuwei2015/article/details/83387536

自旋鎖(spinlock):是指當一個線程在獲取鎖的時候,如果鎖已經被其它線程獲取,那麼該線程將循環等待,然後不斷的判斷鎖是否能夠被成功獲取,直到獲取到鎖纔會退出循環。 

 

自旋鎖可以使線程在沒有取得鎖時,不被掛起,而轉去執行一個空循環,在若干個空循環後,線程如果可以獲取鎖,則繼續執行,若線程依然不能獲得鎖,纔會被掛起。

使用自旋鎖後,線程被掛起的機率相對較小線程執行的連貫性相對加強,因此對於鎖競爭不是很激烈,鎖佔用的的時間很短的併發線程,具有一定的積極意義,但對於鎖競爭激烈,單線程鎖佔用時間長的併發程序,自旋鎖早在自旋後,往往依然無法獲得對應的鎖,浪費CPU,最終還得被掛起的操作。

JDK1.6中,-XX:+UseSpinning參數來開啓自旋鎖,使用-XX:PreBlockSpin參數來設置自旋鎖的等待次數。

JDK1.7zhong ,自旋鎖的參數被取消,虛擬機不再支持用戶配置自旋鎖,自旋鎖總是會執行,自旋鎖的次數也由虛擬機自行調整。

 

獲取鎖的線程一直處於活躍狀態,但是並沒有執行任何有效的任務,使用這種鎖會造成busy-waiting。

自旋鎖的缺點

使用自旋鎖會有以下一個問題: 

1. 如果某個線程持有鎖的時間過長,就會導致其它等待獲取鎖的線程進入循環等待,消耗CPU。使用不當會造成CPU使用率極高。 

2. 上面Java實現的自旋鎖不是公平的,即無法滿足等待時間最長的線程優先獲取鎖。不公平的鎖就會存在“線程飢餓”問題。

自旋鎖的優點

自旋鎖不會使線程狀態發生切換,一直處於用戶態,即線程一直都是active的;不會使線程進入阻塞狀態,減少了不必要的上下文切換,執行速度快

非自旋鎖在獲取不到鎖的時候會進入阻塞狀態,從而進入內核態,當獲取到鎖的時候需要從內核態恢復,需要線程上下文切換。 (線程被阻塞後便進入內核(Linux)調度狀態,這個會導致系統在用戶態與內核態之間來回切換,嚴重影響鎖的性能)

發佈了472 篇原創文章 · 獲贊 224 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章