商君

导航

Go Example--原子计数器

package main

import (
	"fmt"
	"runtime"
	"sync/atomic"
	"time"
)

func main() {
	var ops uint64 = 0
	for i := 0; i < 50; i++ {
		//起50个协程
		go func() {
			for {
				//每个协程对ops变量进行+1操作
				atomic.AddUint64(&ops, 1)
				//协程调度
				runtime.Gosched()
			}
		}()
	}
	//等待1s
	time.Sleep(time.Second)
	//为了在计数器还在被其它 Go 协程更新时,安全的使用它,我们通过 LoadUint64 将当前值的拷贝提取到 opsFinal中。和上面一样,我们需要给这个函数所取值的内存地址 &ops
	opsFinal := atomic.LoadUint64(&ops)
	fmt.Println("ops:", opsFinal)
}

posted on 2018-10-22 19:44  漫步者01  阅读(349)  评论(0编辑  收藏  举报