GO atomic包
阿新 • • 發佈:2022-02-14
需求
對變數併發執行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 操作參考