学习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 }
posted @ 2019-05-23 11:39  卓扬  阅读(305)  评论(0编辑  收藏  举报