package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64
var wg sync.WaitGroup
// 启动10个协程
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
// 原子增加操作
atomic.AddInt64(&counter, 1)
}()
}
// 等待所有协程完成
wg.Wait()
// 原子读取操作
value := atomic.LoadInt64(&counter)
fmt.Printf("Final counter value: %d\n", value)
}
原子操作函数原理:
atomic.AddInt64
:
- 作用:对
int64
类型的变量进行原子性的加法操作。
- 原理:它通过硬件层面的原子指令(如
x86
架构下的LOCK
前缀指令)来确保在多处理器环境下,该操作是不可分割的。当多个协程同时调用atomic.AddInt64
对同一个变量进行操作时,硬件会保证每次只有一个操作能成功执行,其他操作必须等待,从而避免了竞态条件。
atomic.LoadInt64
:
- 作用:原子性地读取
int64
类型变量的值。
- 原理:同样利用硬件层面的原子指令,保证在读取变量值时,不会受到其他协程对该变量写操作的干扰,确保读取到的值是完整且一致的。