Go 中 sync/atomic 通过底层 CPU 原子指令实现无锁高性能计数,比 mutex 更轻量高效;仅支持基础类型原子操作,需取地址调用且避免与普通赋值混用。
在 Go 中,sync/atomic 是实现无锁、高性能并发计数的核心工具。它直接映射到底层 CPU 的原子指令(如 LOCK XADD),比加锁更轻量,适合高频读写计数器场景。
使用 sync.Mutex 保护一个整型计数器虽然安全,但每次增减都要获取/释放锁,存在调度开销和竞争排队;而 atomic 操作是单条 CPU 指令,无上下文切换,吞吐更高。尤其在多核高并发下,性能差距明显。
注意:atomic 只支持基础类型(int32, int64, uint32, uint64, uintptr, *unsafe.Pointer)及其指针操作,不能用于结构体或 map 等复合类型。
声明计数器时必须用支持原子操作的类型(推荐 int64,避免 32 位平台对齐问题),并确保变量地址对齐(全局变量或堆分配自动满足):
立即学习“go语言免费学习笔记(深入)”;
✅ 正确示例:
var counter int64(全局或包级变量)atomic.AddInt64(&counter, 1)
atomic.LoadInt64(&counter)

atomic.StoreInt64(&counter, 100)
atomic.CompareAndSwapInt64(&counter, old, new),仅当当前值等于 old 时才设为 new,返回是否成功— 计数器必须取地址传递给 atomic 函数,传值会报编译错误;
— 不要混用 atomic 和普通赋值(如 counter = 42),这会破坏原子性;
— 避免在非对齐内存上使用(如 struct 中未导出的 int32 字段紧邻其他字段),可能导致 panic(尤其在 ARM 上);
— atomic.Value 用于安全读写任意类型(如 map[string]int),但它不提供原子增减,只做整体替换。
以下是一个启动 10 个 goroutine 并发累加 1000 次的计数器:
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
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("Final count:", atomic.LoadInt64(&counter)) // 输出 10000
}
若换成普通 counter++ 且无锁,结果大概率小于 10000 —— 这正是竞态的典型表现。
# go
# golang
# 工具
# ai
# 编译错误
# 无锁
# 为什么
# String
# 整型
# 全局变量
# 结构体
# int
# 指针
# 堆
# Struct
# var
# pointer
# map
# 并发
# 多核
# 会报
# 高性能
# 是一个
# 都要
# 设为
# 更高
# 它不
# 时才
# 只做
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Windows10如何更改鼠标图标_Win10鼠标属性指针浏览
Windows怎样关闭Edge新标签页广告_Windows关闭Edge新标签页设置【步骤】
Win11怎么关闭键盘按键音_Win11禁用打字声音反馈【教程】
Win11怎么设置单手模式_Win11触控键盘布局调整教程【技巧】
Win11怎么恢复出厂设置_Win11重置此电脑保留文件方法【详解】
Windows系统被恶意软件破坏后的恢复策略_错误提示修复方式
如何在 VS Code 中正确配置并使用 NumPy
如何在JavaScript中动态拼接PHP的base_url与前端变量
Windows10如何彻底关闭自动更新_Win10服务与组策略双重禁用
XML的“混合内容”是什么 怎么用DTD或XSD定义
Win11怎么清理C盘系统错误报告_Win11清理系统错误报告技巧【教程】
如何使用Golang捕获并记录协程panic_保证主程序稳定运行
WindowsUSB驱动安装异常怎么办_USB驱动重建与恢复教程
Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】
如何使用Golang进行HTTP服务性能测试_测量吞吐量和延迟
Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置
如何在Golang中使用内置函数_Golanglen append make等使用技巧
Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法
如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法
如何解决Windows字体显示模糊的问题?(ClearType设置)
如何在 Python 中将 ISO 8601 时间戳转换为日期并计算日期差值
Win11怎么设置虚拟键盘_打开Win11屏幕键盘操作指南【技巧】
使用类变量定义字符串常量时如何实现类型安全的 Literal 注解
Win11色盲模式怎么开_Win11屏幕颜色滤镜设置【关怀】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
windows如何测试网速_windows系统网络速度测试方法
Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理
如何用正则表达式精确匹配“start”到“end”之间最多含一个换行符的文本段
Win11怎么开启HDR模式_Windows 11高动态范围显示设置指南【详解】
Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】
小程序里php怎么变mp4_小程序调用php生成mp4视频方法【教程】
Windows10如何重置此电脑_Windows10电脑重置方法【步骤】
C#如何在一个XML文件中查找并替换文本内容
如何在Golang中捕获结构体方法错误_Golang方法返回error处理实践
如何使用Golang sort排序切片_Golang sort排序方法示例
Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答)
php下载安装包太大怎么下载_分卷压缩下载方法【教程】
php订单日志怎么按金额排序_php按订单金额排序日志方法【方法】
Mac如何彻底清理浏览器缓存?(Safari与Chrome)
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
php报错怎么查看_定位PHP致命错误与警告的方法【教程】
c# Task.ConfigureAwait(true) 在什么场景下是必须的
c++怎么设置线程优先级与cpu亲和性_c++ 多核处理器性能绑定【指南】
Win11鼠标灵敏度怎么调 Win11鼠标指针移动速度设置【教程】
Win11怎么关闭边缘滑动手势_Windows11禁用触摸屏边缘操作
Python函数缓存机制_lru_cache解析【指导】
Linux如何挂载新硬盘_Linux磁盘分区格式化与开机自动挂载【指南】
如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法
如何使用Golang安装API文档生成工具_快速生成接口文档
PHP 中如何在函数内持久修改引用变量所指向的目标
2026-01-05
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。