GO語言鎖的處理機制(簡單描述,不喜勿噴,歡迎糾正)

獲取鎖的機制
如果當前沒有goroutine獲取到鎖則直接獲取
如果鎖已經被獲取,則goroutine會被休眠加入一個先進先出的隊列
 
解鎖的機制
1.嘗試解鎖,如果本來就沒有加鎖,則拋異常
2.正常解鎖後,通過信號量的方式喚醒等待中的goroutine,開始爭搶鎖(因爲新的goroutine正在cpu中運行,所以等待中的goroutine需要一個喚醒的過程這就導致速度慢了,一直被新的goroutine獲取鎖),
 如果爭搶鎖的goroutine首次沒有獲取到鎖,則會通過一定次數的自旋來不斷的獲取鎖,爭搶結束後(其中一個goroutine獲取到了鎖),剩餘的goroutine會加入到等待隊列重新休眠,
 如果不是首次加入隊列,則會被加入到隊列的首位(如果是飢餓模式,新來的goroutine不會參與爭搶,直接加入到等待隊列,下面會介紹飢餓模式)
 
 
解決飢餓
因爲新來的 goroutine 也參與競爭,有可能每次都會被新來的 goroutine 獲取到鎖(因爲新來的goroutine正在cpu中運行,所以速度更快),
在極端情況下,等待中的 goroutine 可能會一直獲取不到鎖,這就是飢餓問題。在這樣的情況下,鎖的爭搶就會進入飢餓模式。
 
 
在飢餓模式中,等待中的goroutine等待時間超過閾值1毫秒的情況下,就可以優先獲取到鎖,之後鎖的爭搶會回到正常模式
 
GO語言中鎖的源碼較長,幾乎無法閱讀,所以理解機制即可。
整個的流程差不多是上面說的這樣,如果有錯誤,請大家糾正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章