如何使用Golang的sync/atomic实现原子操作_Golang原子操作与并发性能优化-Golang

Go 的 sync/atomic 包仅适用于基础类型(int32/int64/uint32/uintptr/*T/unsafe.Pointer)的简单操作,bool/float 需转换,复合类型须用 atomic.Value;其默认 relaxed 内存序不保证顺序,强同步需 Add 或 CAS;多数场景 mutex 更安全清晰。

Go 的 sync/atomic 包不是“替代 mutex 的万能方案”,而是为极少数特定场景设计的底层工具:仅当操作对象是基础类型(int32、int64、uint32、uintptr、*T、unsafe.Pointer)且逻辑足够简单时,才适合用原子操作。滥用反而会掩盖竞态、降低可读性,甚至因内存序误用引发隐蔽 bug。

哪些变量能用 atomic 安全修改?

只能对以下类型的变量直接调用 atomic 函数:

  • int32、int64、uint32、uint64、uintptr
  • bool 不行 —— 必须用 int32 模拟(0/1),再用 atomic.LoadInt32/atomic.StoreInt32
  • float32/float64 不行 —— 需转成 uint32/uint64 后用 atomic.LoadUint32 等,且需注意 IEEE 754 表示与平台字节序
  • 结构体、切片、map、interface{} 等复合类型不能直接原子操作 —— 若需“原子更新整个结构”,应改用 atomic.Value(它内部用读写锁+指针替换实现)

atomic.LoadUint64 和 atomic.StoreUint64 的典型误用

看似安全的读写组合,在无同步约束下仍可能违反期望顺序。例如:

var counter uint64
// goroutine A:
atomic.StoreUint64(&counter, 1)
// goroutine B:
v := atomic.LoadUint64(&counter) // 可能读到 0(如果 Store 还没完成可见)

这不是函数 bug,而是内存模型决定的:Go 的 atomic 默认提供“relaxed”内存序,不保证与其他内存访问的顺序。若需强顺序(如“写完立刻让所有 goroutine 看到”),必须配合 atomic.AddUint64 或显式使用 atomic.CompareAndSwapUint64 构建同步点。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » 如何使用Golang的sync/atomic实现原子操作_Golang原子操作与并发性能优化-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4030937+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1393+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4030937+
  • 本周更新: 0+
  • 最后更新: 2026-03-16