需求

对变量并发执行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 操作​​参考​