您好,登錄后才能下訂單哦!
這篇文章主要介紹了Go語言中的sync.Mutex如何使用的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Go語言中的sync.Mutex如何使用文章都會有所收獲,下面我們一起來看看吧。
多個協(xié)程操作中經(jīng)常出現(xiàn)臟讀寫的情況,這種情況下需要使用互斥鎖,保證在對協(xié)程共享區(qū)域操作的原子性。
如下示例:
啟動了 100個協(xié)程,每個協(xié)程累加 100 次,在沒有臟讀寫的情況下,最后結(jié)果應該是 100 * 100 = 10000
package main import ( "fmt" "sync" ) func main() { var count = 0 var wg sync.WaitGroup wg.Add(100) for i :=0; i< 100; i++ { go func(){ defer wg.Done() for j := 0; j< 100; j ++ { count ++ } }() } wg.Wait() fmt.Println(count) }
但是實際結(jié)果一直小于 10000
count ++ 操作, 分為三個步驟
在協(xié)程的共享區(qū)域取出 count 當前值
當前值加一
加一后的值寫回協(xié)程共享區(qū)域
這時需要使用互斥鎖, 來保證對 count++ 的三個操作過程中沒有其他協(xié)程進行讀寫。
Go的Sync 包提供了Mutex, 讀寫互斥的鎖, 來保證只有一個協(xié)程對數(shù)據(jù)進行讀寫操作。 以保證 count++操作的原子性
如下示例:
package main import ( "fmt" "sync" ) func main() { var count = 0 // 聲明Mutex變量 var mu sync.Mutex var wg sync.WaitGroup wg.Add(100) for i :=0; i< 100; i++ { go func(){ defer wg.Done() for j := 0; j< 100; j ++ { // 添加鎖 mu.Lock() count ++ // 解鎖 mu.Unlock() } }() } wg.Wait() fmt.Println(count) }
在mu.Lock()
和mu.Unlock()
之間的代碼可以保證在操作只會被一個協(xié)程執(zhí)行。這樣執(zhí)行結(jié)果就是 10000 了
mu.Lock()
和mu.Unlock()
必須成對出現(xiàn),在忘掉 Unlock 的情況下,鎖獲取后永遠不會得到釋放,其他 的線程/協(xié)程會永遠處于阻塞狀態(tài),永遠獲取不到鎖,在忘掉 Lock 的情況下,直接 Unlock 一個未加鎖的 Mutex,會導致程序 panic。
關(guān)于“Go語言中的sync.Mutex如何使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Go語言中的sync.Mutex如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。