如何在Golang中使用sync/atomic实现原子操作_安全并发计数


Go 中 sync/atomic 通过底层 CPU 原子指令实现无锁高性能计数,比 mutex 更轻量高效;仅支持基础类型原子操作,需取地址调用且避免与普通赋值混用。

在 Go 中,sync/atomic 是实现无锁、高性能并发计数的核心工具。它直接映射到底层 CPU 的原子指令(如 LOCK XADD),比加锁更轻量,适合高频读写计数器场景。

为什么用 atomic 而不是 mutex?

使用 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)
  • 条件更新(CAS):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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.