当前位置: 首页 > news >正文

Go 并发原语

Go 并发原语

Go 语言提供了丰富的并发原语同步工具),涵盖锁、原子操作、通道、等待组、一次性执行等类别

一、 分类

类别包含原语目标
互斥同步Mutex、RWMutex保护临界区,保证独占 / 读写安全
原子操作atomic无锁操作单个变量,极致性能
同步协调WaitGroup、Cond、Once协调 goroutine 执行顺序 / 时机
通信共享channel(无缓冲 / 有缓冲)goroutine 间通信

二、对比

2.1 互斥锁Mutex 和 RWMutex

特性MutexRWMutex
加锁规则同一时间仅一个 goroutine 加锁读锁:多 goroutine 并发;写锁:仅一个 goroutine
互斥关系读写 / 写写 / 读读均互斥读写 / 写写互斥,读读不互斥
性能简单无额外开销读多写少场景性能更高,有状态管理开销
缺点读并发性能差写锁阻塞所有读锁,状态管理有开销
适用场景读写频率相当、写操作占比高读多写少(如配置读取、缓存查询)

2.2 原子操作(sync/atomic)vs Mutex

特性sync/atomicMutex
操作粒度单个变量(int32/64、uintptr、Pointer 等)任意临界区(变量 / 代码块 / 数据结构)
实现方式CPU 原子指令(无锁)自旋 + 阻塞 + 信号量(有锁)
性能极致快(约 1ns / 次)无竞争约 10ns / 次,有竞争大幅下降
功能限制仅支持原子读写 / 增减 / 交换支持任意逻辑(如复合操作、数据结构修改)
适用场景简单变量的并发读写(计数器、标志位)复杂临界区、复合操作
风险易误用(如非原子操作组合)死锁、锁粒度大导致性能差

2.3 Channel vs Mutex(通信 vs 共享内存)

特性channel(通道)Mutex
设计理念通信共享内存(Go 推荐)共享内存加锁
同步方式阻塞式通信(发送 / 接收阻塞)阻塞式加锁
适用场景goroutine 间数据传递、任务分发、限流保护共享资源的读写
优点逻辑清晰、天然避免死锁(无锁)简单直接、适配所有临界区
缺点有内存开销(通道缓冲区)、性能略低易死锁、需手动管理锁配对
性能(无竞争)发送 / 接收约 20ns / 次加解锁约 10ns / 次
典型用法生产者 - 消费者、goroutine 池、信号通知共享变量 / 数据结构保护

2.4 同步协调原语:WaitGroup vs Once vs Cond

特性sync.WaitGroupsync.Oncesync.Cond
核心功能等待一组goroutine完成保证函数仅执行一次条件变量,唤醒等待的goroutine
触发方式Add()+Done()+Wait()Do(func())Wait()+Signal()/Broadcast()
适用场景批量 goroutine 等待(如多任务执行)单例初始化、配置加载多 goroutine 等待某个条件满足
优点轻量、易用线程安全、无需手动加锁精准控制唤醒(单个 / 全部)
缺点不可重用(计数归 0 后不可再用)仅支持单次执行需配合 Mutex 使用,逻辑复杂
典型用法等待 10 个 goroutine 完成任务初始化数据库连接(仅一次)等待队列非空后唤醒消费者
http://www.jsqmd.com/news/529632/

相关文章:

  • 为什么92%的团队在Python 3.15升级后多解释器配置失败?揭秘subinterpreter初始化5大隐性陷阱
  • 2026/3/24总结
  • 把Gitea和MySQL都塞进Docker?飞牛NAS上的轻量级代码仓库搭建实录
  • 华三模拟器(H3C Simulator)新手避坑指南:搞定Telnet配置中的密码策略和接口模式切换
  • 【数据赋能】方言语音识别技术的突破与应用
  • 能量基模型在深度学习中的创新应用与实践
  • EcomGPT-7B电商模型对比评测:与传统规则引擎在客服场景的效果差异
  • 无线UWB自标定技术:如何让基站自动“找到”自己?
  • 2026年碳五石油树脂、石蜡、甲酸、氢氧化钠与聚合氯化铝一体化供应新路径:兰州三金化工的多维化工服务能力解析 - 深度智识库
  • KubeKey离线部署K8s集群,containerd死活拉不了私有镜像?手把手教你搞定证书认证
  • 避开FPGA时序约束的坑:Vivado Check_timing报告中那些‘High’级别警告都意味着什么?
  • 基于Comsol的SOFC单通道非绝热燃料电池模型:包括气体扩散层与实际SEM扫描结果的电极扩...
  • ESP32-S3开发板避坑指南:从SD卡挂载到LVGL屏幕异常的5个实战解决方案
  • Windows Server域环境下共享文件夹容量配额管理实战:从配置到验证的完整流程
  • 揭秘MCP Sampling接口底层调用栈:基于eBPF实时追踪syscall→gRPC stream→采样率动态熔断阈值触发全过程(含火焰图)
  • AcFun视频下载神器:3步轻松保存A站所有精彩内容!
  • 告别S32DS内置编辑器:用VSCode写代码,搭配J-Link在S32DS中调试S32K144的完整流程
  • MCP vs REST API:20万QPS压测数据曝光,为什么头部大厂已悄悄切换协议栈?
  • Vue-Flow-Editor 流程可视化:7个提效技巧助力业务流程设计
  • 别再只会用OpenCV的resize了!手把手教你用Python实现三种经典图像放大算法(附完整代码)
  • CellphoneDB统计分析实战:单细胞通讯中的配体-受体互作解析
  • 告别纯GPS:手把手教你为Pixhawk无人车配置视觉惯性导航(VIO)与MAVROS融合定位
  • 终极黑苹果安装指南:如何在普通PC上运行macOS系统
  • 效率直接起飞 9个降AIGC工具:毕业论文全流程降AI率测评与推荐
  • Display Driver Uninstaller终极使用指南:彻底解决显卡驱动残留问题
  • 内网开发必备:Maven本地仓库jar包失效的终极解决方案(附一键清理脚本)
  • 从内存访问模式到缓存优化:实战解析Perf的PEBS数据地址剖析功能
  • 【从零开始学Java | 第十八篇】BigInteger
  • C30混凝土实体群桩与边坡稳定性的数值计算模拟及监测研究
  • SUNFLOWER MATCH LAB 科研工具链:Matlab数据预处理与模型调用接口