学习Go语言之使用原子访问或互斥锁解决竞态问题
使用原子访问或互斥锁
1 // 解决竞态问题 2 package main 3 4 import ( 5 "fmt" 6 "sync" 7 "sync/atomic" 8 ) 9 10 var ( 11 i int64 12 iMutex sync.Mutex 13 wg sync.WaitGroup 14 ) 15 16 func AutoIncrease() { 17 defer wg.Done() 18 19 //1.使用原子访问 20 atomic.StoreInt64(&i, atomic.AddInt64(&i, 1)) 21 22 // 2.使用互斥锁 23 // iMutex.Lock() 24 // i++ 25 // iMutex.Unlock() 26 } 27 28 func main() { 29 for k := 0; k < 10; k++ { 30 wg.Add(1) 31 go AutoIncrease() 32 } 33 // 等待WaitGroup全部完成,否则此处使用i会发生data race。main中函数和goroutine中的AutoIncrease是并发执行的 34 wg.Wait() 35 fmt.Println(i) 36 }