通过同步/原子程序包,原子变量用于管理状态并避免争用条件。原子计数器可以通过多个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
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)