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) }
请发表评论