多線程中,對共享資源進行訪問喉悴,為了防止并發(fā)引起的相關(guān)問題巫击,通常都是引入鎖的機制來處理并發(fā)問題禀晓。
獲取到資源的線程A對這個資源加鎖,其他線程比如B要訪問這個資源首先要獲得鎖坝锰,而此時A持有這個資源的鎖粹懒,只有等待線程A邏輯執(zhí)行完,釋放鎖顷级,這個時候B才能獲取到資源的鎖進而獲取到該資源凫乖。
這個過程中,A一直持有著資源的鎖,那么沒有獲取到鎖的其他線程比如B怎么辦帽芽?通常就會有兩種方式:
一種是沒有獲得鎖的進程就直接進入阻塞(BLOCKING)删掀,這種就是互斥鎖
另外一種就是沒有獲得鎖的進程,不進入阻塞导街,而是一直循環(huán)著披泪,看是否能夠等到A釋放了資源的鎖。
自旋鎖(spin lock)是一種非阻塞鎖搬瑰,也就是說款票,如果某線程需要獲取鎖,但該鎖已經(jīng)被其他線程占用時跌捆,該線程不會被掛起徽职,而是在不斷的消耗CPU的時間,不停的試圖獲取鎖佩厚。
互斥量(mutex)是阻塞鎖姆钉,當(dāng)某線程無法獲取鎖時,該線程會被直接掛起抄瓦,該線程不再消耗CPU時間潮瓶,當(dāng)其他線程釋放鎖后,操作系統(tǒng)會激活那個被掛起的線程钙姊,讓其投入運行毯辅。
為什么要使用自旋鎖
互斥鎖有一個缺點,他的執(zhí)行流程是這樣的 托管代碼 - 用戶態(tài)代碼 - 內(nèi)核態(tài)代碼煞额、上下文切換開銷與損耗思恐,假如獲取到資源鎖的線程A立馬處理完邏輯釋放掉資源鎖,如果是采取互斥的方式膊毁,那么線程B從沒有獲取鎖到獲取鎖這個過程中胀莹,就要用戶態(tài)和內(nèi)核態(tài)調(diào)度、上下文切換的開銷和損耗婚温。所以就有了自旋鎖的模式描焰,讓線程B就在用戶態(tài)循環(huán)等著,減少消耗栅螟。
自旋鎖比較適用于鎖使用者保持鎖時間比較短的情況荆秦,這種情況下自旋鎖的效率要遠高于互斥鎖。