Go 原子变量
Go 原子变量
原子变量用于管理状态,虽然同步/原子包并避免竞争条件。多个 go 例程可以访问原子计数器。
Go 原子变量示例
package main
import (
"sync"
"time"
"math/rand"
"fmt"
"sync/atomic"
)
var wait sync.WaitGroup
var count int64
func increment(s string) {
for i :=0;i<10;i++ {
time.Sleep(time.Duration((rand.Intn(3)))*time.Millisecond)
atomic.AddInt64(&count,1)
fmt.Println(s,i,"Count->",count)
}
wait.Done()
}
func main(){
wait.Add(2)
go increment("foo: ")
go increment("bar: ")
wait.Wait()
fmt.Println("last count value " ,count)
}
输出:
foo: 0 Count-> 1
foo: 1 Count-> 2
bar: 0 Count-> 3
bar: 1 Count-> 4
bar: 2 Count-> 5
foo: 2 Count-> 6
bar: 3 Count-> 7
bar: 4 Count-> 8
bar: 5 Count-> 9
foo: 3 Count-> 10
bar: 6 Count-> 11
bar: 7 Count-> 12
foo: 4 Count-> 13
foo: 5 Count-> 14
bar: 8 Count-> 15
bar: 9 Count-> 16
foo: 6 Count-> 17
foo: 7 Count-> 18
foo: 8 Count-> 19
foo: 9 Count-> 20
last count value 20