Go语言中的atomic包提供了一些原子操作,这些原子操作可以保证并发安全,即使有多个goroutine同时访问同一个变量,也不会发生数据竞争。
常用的原子操作有以下几种:
- AddInt32/64,用于对int32/64类型的值进行原子加法操作
- CompareAndSwapInt32/64,用于比较并交换int32/64类型的值
- SwapInt32/64,用于原子交换int32/64类型的值
- LoadInt32/64,用于原子加载int32/64类型的值
- StoreInt32/64,用于原子存储int32/64类型的值
下面是一个使用atomic包的示例代码:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var count int32 = 0 // 定义一个计数器
// 创建10个goroutine,每个goroutine会对计数器执行1000次原子加操作
for i := 0; i < 10; i++ {
go func() {
for j := 0; j < 1000; j++ {
atomic.AddInt32(&count, 1)
}
}()
}
// 等待所有goroutine执行完毕
for i := 0; i < 10; i++ {
<-done
}
// 输出最终的计数器值
fmt.Println(count)
}
可以看到,通过使用atomic包提供的原子操作,可以保证对count变量的并发访问安全。