0

0

Golang中的并发安全计数器 Go语言atomic包基础语法

P粉602998670

P粉602998670

发布时间:2026-03-06 10:51:10

|

573人浏览过

|

来源于php中文网

原创

atomic.addint64 要求参数为 *int64,因 go 用类型系统强制并发安全边界;需声明 var count int64 并传 &count,读取后按需转 int;compareandswapint64 不防 aba,需手动加版本号或改用锁;atomic.loaduint64 不保证实时最新值,仅保顺序一致性;atomic.value 仅保障整体存取原子性,内部结构须不可变或另加保护。

golang中的并发安全计数器 go语言atomic包基础语法

atomic.AddInt64 为什么不能直接用 int?

Go 的 atomic 包所有操作都要求类型严格匹配,AddInt64 只接受 *int64,传 int*int 会编译报错:first argument to atomic.AddInt64 must be *int64。这不是疏忽,是 Go 故意用类型系统守住并发安全的边界。

常见错误:把普通计数器变量声明成 var count int,然后想直接 atomic.AddInt64(&count, 1) —— 这行不通。

  • 必须显式声明为 int64var count int64
  • 指针取址后才能传入:atomic.AddInt64(&count, 1)
  • 如果原始业务逻辑依赖 int(比如切片长度、循环上限),记得在读取后做显式转换:int(count),但注意避免在原子读写中间插入非原子逻辑

CompareAndSwapInt64 怎么避免“ABA 问题”?

CompareAndSwapInt64 是无锁编程的核心,但它本身不解决 ABA 问题:即某个值从 A→B→A,CAS 误判为“没变过”。Go 标准库不内置版本号或标记位机制,得靠你自己设计。

典型场景:实现一个简易的带状态切换的计数器(如“启用/禁用中”),只靠一个 int64 表达状态容易出错。

立即学习go语言免费学习笔记(深入)”;

phpList
phpList

phpList提供开源电子邮件营销服务,包括分析、列表分割、内容个性化和退信处理。丰富的技术功能和安全稳定的代码基础是17年持续开发的结果。在95个国家使用,在20多种语言中可用,并用于去年发送了250亿封电子邮件活动。您可以使用自己的SMTP服务器部署它,或在http://phplist.com上获得免费的托管帐户。

下载
  • 别只存纯数值;加个低几位当状态标志,比如用 int64 高 56 位存计数值,低 8 位存状态码
  • atomic.LoadUint64 + 位运算读取组合值,再用 atomic.CompareAndSwapUint64 做带掩码的原子更新
  • 如果业务允许,更简单的方式是换用 sync.Mutexsync.RWMutex —— 不是所有地方都值得上无锁

atomic.LoadUint64 读取时为什么有时看到“旧值”?

这是正常现象。atomic 提供的是“顺序一致性”(sequential consistency)模型,不是实时同步。它保证所有 goroutine 看到的操作顺序是一致的,但不保证你 Load 的那一刻一定是最新的 —— 尤其在高竞争、多核缓存未及时刷新时。

常见误解:以为 atomic.Load 等价于“立刻拿到最新写入值”,其实它只是防止了数据撕裂和重排序,不提供“强实时性”。

  • 如果你需要“等待直到某条件成立”,别轮询 Load,改用 sync.WaitGroupchannel
  • 频繁读+极少写的场景,atomic 没问题;但读写比接近 1:1 时,缓存行争用反而可能比 sync.RWMutex 更慢
  • 调试时看到旧值,先确认是否真有其他 goroutine 在写;用 go tool trace 观察调度和原子操作实际执行时间点

用 atomic.Value 存 map 或 struct 安全吗?

安全,但仅限“整体替换”,不能对内部字段做并发修改。atomic.Value 只保证 StoreLoad 操作本身原子,不递归保护内部数据结构。

典型翻车现场:存一个 map[string]int,多个 goroutine 同时 Load 出来后直接往里 put —— panic:concurrent map writes

  • 存之前先深拷贝或构造不可变副本:v.Store(mapCopy(oldMap))
  • 若需频繁更新内部字段,别用 atomic.Value,改用 sync.Map(适合读多写少)或带锁封装
  • atomic.Valuenil 支持良好,但首次 Store 后类型就固定了,后续 Store 必须同类型,否则 panic:Store of inconsistent type
事情说清了就结束。真正难的从来不是调哪个函数,而是判断“这里到底需不需要原子操作”——多数时候,先加锁跑通逻辑,再看 profile 数据决定要不要动 atomic

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

209

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

245

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

355

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

407

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

450

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

200

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1335

2025.06.17

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号