sync.Mutex
type Mutex struct {
state int32
sema uint32
}
//state = 0 未加鎖 加鎖解鎖都是通過原子操作進(jìn)行修改
//sema 信號量 用于等待隊列

image.png
工作模式
-
正常模式
- 高吞吐量,自旋線程會搶鎖,掛起喚醒少
一個嘗試加鎖的goroutine 會先自旋幾次,嘗試通過原子操作獲得鎖;如果幾次自旋后無法獲得,就會加入到信號量隊列,按照FIFO進(jìn)行排隊等待,
當(dāng)鎖被釋放,第一個等待著被喚醒后不會立即獲得鎖,需要與其他自旋goroutine進(jìn)行競爭, 因為自旋goroutine運行在cpu上且數(shù)量多,更容易獲得鎖;等待著拿不到鎖,會重新插入到隊列頭部
-
饑餓模式
- 嚴(yán)格按照排隊,可以防止尾端延遲(即最后等待隊列 goroutine遲遲獲得不到鎖)
當(dāng)goroutine等待加鎖的時間超過1ms,Mutex會切換到饑餓模式
會把執(zhí)行unlock的goroutine的鎖直接傳給 等待隊列,其他自旋goroutine會加入到等待隊列尾部,進(jìn)行排隊
-
饑餓模式 ---> 正常模式
獲得鎖的goroutine等待時間 小于1ms,
獲得鎖的goroutine是等待隊列最后一個。