go mutex是互斥鎖,只有Lock和Unlock兩個方法。而且lock和unlock之間的代碼都只能由一個 Go 協程執行,於是就可以避免競態條件。
package main import ( "fmt" "sync" ) var wg = sync.WaitGroup{} var sum int //sum 增加20 func Add(){ sum = sum +1 wg.Done() } func main() { for i:= 0;i< 10000;i++{ wg.Add(1) go Add() } wg.Wait() fmt.Println("sum =",sum) }
起了10000個協程讓sum自增1,但是結果卻每次不一樣,因為競態,多個協程可能獲取了同一個值,因此出現問題
使用sync.Mutex互斥鎖解決此問題
package main import ( "fmt" "sync" ) var wg = sync.WaitGroup{} var sum int var lock = sync.Mutex{} //sum 增加20 func Add(){ lock.Lock() defer lock.Unlock() sum = sum +1 wg.Done() } func main() { for i:= 0;i< 10000;i++{ wg.Add(1) go Add() } wg.Wait() fmt.Println("sum =",sum) }