- 使用
AddInt64
实现多个协程安全加法操作:
- 在Go语言中,
sync/atomic
包提供了原子操作函数,AddInt64
用于对int64
类型的变量进行原子加法操作。
- 示例代码如下:
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var num int64
var wg sync.WaitGroup
// 启动10个协程
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
// 每个协程对num执行1000次加法操作
for j := 0; j < 1000; j++ {
atomic.AddInt64(&num, 1)
}
}()
}
// 等待所有协程完成
wg.Wait()
fmt.Println("最终结果:", num)
}
- 不能直接使用普通变量自增操作的原因:
- 在并发场景下,普通的变量自增操作(如
num++
)不是原子操作。它实际上包含了读取变量值、增加1、再写回变量这三个步骤。
- 当多个协程同时执行
num++
时,可能会出现竞态条件。例如,两个协程同时读取到num
的值为10,然后各自增加1,最后写回的结果都是11,而不是预期的12。
- 而
atomic.AddInt64
函数是原子操作,它能保证在多协程环境下对int64
变量的加法操作是线程安全的,不会出现竞态条件,从而保证数据的一致性。