n++是原子操作吗?
多核CPU情况下,CPU对内存的操作不是原子的,这个和语言无关,实际上 n++ 操作就是CPU先从内存取回n的值,然后加1,再放回内存,显然是存在并发问题的。
package main
import (
"fmt"
"sync"
"sync/atomic"
)
var wg sync.WaitGroup
var num int64
var mu sync.Mutex
func main() {
for i := 0; i < 1000; i++ {
wg.Add(1)
go action()
}
wg.Wait()
fmt.Println(num)
}
func action() {
num++
wg.Done()
}
func action1() {
mu.Lock()
num++
mu.Unlock()
wg.Done()
}
func action2() {
atomic.AddInt64(&num, 1)
wg.Done()
}
actionaction1action2
atomic