Go语言中atomic包提供轻量级原子操作,适用于多协程下对基本类型的安全读写。1. 支持int32、int64、uint32、uint64、uintptr、unsafe.Pointer及布尔值的原子操作,常用函数有LoadXXX、StoreXXX、AddXXX和CompareAndSwapXXX。2. 示例中使用atomic.AddInt64和atomic.LoadInt64实现并发安全计数器,通过sync.WaitGroup协调1000个goroutine递增共享变量counter,最终输出正确的计数值1000,避免了传统锁的开销。

在Go语言中,atomic包提供了底层的原子操作支持,适用于多协程环境下对基本数据类型的读写保护。相比互斥锁(sync.Mutex),原子操作更轻量、高效,特别适合计数器、状态标志等简单共享变量的场景。
atomic包主要支持对以下类型的原子操作:
常用函数包括:
下面是一个并发安全计数器的例子,展示如何用atomic.AddInt64和atomic.LoadInt64实现线程安全的计数:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < 1000; j++ {
atomic.AddInt64(&counter, 1)
}
}()
}
wg.Wait()
fmt.Println("最终计数:", atomic.LoadInt64(&counter))
}
在这个例子中,多个goroutine同时对counter进行递增,使用atomic.AddInt64确保每次加1是原子的,避免了竞态条件。
CAS(Compare and Swap)是一种常见的无锁编程技术。可用于实现更复杂的原子逻辑,比如只设置一次的状态标志:
var status int32 // 0:未初始化, 1:已初始化
func initialize() {
if atomic.CompareAndSwapInt32(&status, 0, 1) {
fmt.Println("执行初始化逻辑")
// 实际初始化代码
} else {
fmt.Println("已被其他协程初始化")
}
}
多个协程调用initialize时,只有第一个能成功将status从0改为1,其余会因当前值已不是0而返回false,从而保证初始化只执行一次。
基本上就这些。atomic适合简单、高频的共享变量操作,理解其使用方式有助于写出更高效的并发程序。关键是根据场景选择合适的方法,不盲目追求性能而牺牲可维护性。
以上就是Golang如何使用atomic实现原子操作的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号