需求
對變量并發執行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