需求
对变量并发执行10000次相加
示例1:裸奔
package main import ( "fmt" "sync" ) var xx int var wg111 sync.WaitGroup func add() { xx++ wg111.Done() } func main() { wg111.Add(100000) for i:=0; i < 100000; i++ { go add() } wg111.Wait() fmt.Println(xx) }
执行1:
90069
执行2:
90126
每次执行不一样。原因:xx++ 等价于xx = xx+1,非原子操作,并行执行的2个会把结果冲掉
示例2:加锁
package main import ( "fmt" "sync" ) var xx int var wg111 sync.WaitGroup var lock111 sync.Mutex func add() { lock111.Lock() xx++ lock111.Unlock() wg111.Done() } func main() { wg111.Add(100000) for i:=0; i < 100000; i++ { go add() } wg111.Wait() fmt.Println(xx) }
执行:
每次都是:100000
示例3:使用atomic
atomic
包提供了底层的原子级内存操作
package main import ( "fmt" "sync" "sync/atomic" ) var xx int32 var wg111 sync.WaitGroup func add() { atomic.AddInt32(&xx, 1) wg111.Done() } func main() { wg111.Add(100000) for i:=0; i < 100000; i++ { go add() } wg111.Wait() fmt.Println(xx) }
执行:
每次都是:100000
其他atomic 操作参考