37-atomic-counters

//  Golang中管理状态的首要机制是通过通道进行通信
//  使用 sync/atomic 包中的原子计数器实现多个goroutine的访问

package main

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

func main() {
	var ops uint64        // 使用无符号整数表示计数器
	var wg sync.WaitGroup // WaitGroup将会等待所以goroutine完成任务

	for i := 0; i < 50; i++ { // 启动50个goroutine,每个都会将计数器增加1000
		wg.Add(1)

		go func() {
			for c := 0; c < 1000; c++ {
				// 使用AddUint64函数以原子的方式增加计数器的值
				// 使用&语法将ops变量的内存地址传递给它
				atomic.AddUint64(&ops, 1)
			}
			wg.Done()
		}()
	}

	wg.Wait() // 等待所以goroutine完成

	// 现在访问ops是安全的,因为已经没有其他的goroutine在写它
	fmt.Println("ops:", ops)
	// 使用atomic.LoadUint64等函数可以在更新数据时进行安全的读取
}
上次修改: 10 January 2020