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

Go语言同步原语与数据竞争:Mutex 与 RWMutex

在Go语言并发程序中,当多个 goroutine 同时读写同一共享变量时,如果不加以控制,会引发数据竞争(race condition),导致程序行为不可预期。

Go 提供了多种同步原语,最基本的就是 sync.Mutex 和 sync.RWMutex


一、什么是数据竞争?

数据竞争发生在两个或多个 goroutine 同时访问相同的内存地址,并且至少有一个是写操作,且未使用同步机制。

表现包括:

  • • 输出错乱、值错误
  • • 程序崩溃或逻辑失常
  • • 非确定性 bug(最难排查)

二、sync.Mutex:互斥锁

sync.Mutex 是最常见的锁,用于保护临界区,使得同一时间只有一个 goroutine 可以进入。

示例:未加锁的并发写入(错误)
var counter intfunc increment() {for i := 0; i < 1000; i++ {counter++}
}func main() {for i := 0; i < 10; i++ {go increment()}time.Sleep(time.Second)fmt.Println("Counter:", counter) // 不确定输出
}
正确使用 Mutex 加锁
var (counter intmutex   sync.Mutex
)func increment() {for i := 0; i < 1000; i++ {mutex.Lock()counter++mutex.Unlock()}
}

三、sync.RWMutex:读写互斥锁

相比 Mutexsync.RWMutex 提供了更细粒度的控制:

操作行为说明
Lock()获取写锁,所有读写都被阻塞
RLock()获取读锁,允许多个同时读
写锁优先级高有写者等待时,新的读锁会被阻止
示例:多个读协程同时访问共享资源
type SafeMap struct {data map[string]stringmu   sync.RWMutex
}func (s *SafeMap) Get(key string) string {s.mu.RLock()defer s.mu.RUnlock()return s.data[key]
}func (s *SafeMap) Set(key, val string) {s.mu.Lock()defer s.mu.Unlock()s.data[key] = val
}

四、使用场景对比

场景推荐使用
多个读协程 + 偶尔写RWMutex
频繁读写,互斥访问临界区Mutex
极端并发 + 只读数据无需加锁(只读)
精确锁粒度对性能有重要影响的系统RWMutex 可调优

五、避免死锁的建议

  • • 加锁后一定记得解锁,推荐使用 defer
  • • 避免多个锁嵌套加锁(容易形成死锁环)
  • • 尽量缩小加锁范围,不要锁整个函数
  • • 避免在持锁状态下调用外部函数(可能阻塞)

六、使用 -race 检查数据竞争

Go 提供了内置的竞态检测工具:

go run -race main.go

可自动分析是否存在数据竞争,是并发调试的利器。


七、小结

  • • sync.Mutex 是最基础的并发控制工具,适用于串行化访问。
  • • sync.RWMutex 适用于读多写少的场景,提升并发效率。
  • • 使用锁时一定要小心死锁与性能瓶颈,配合 -race 工具排查隐患。


文章转载自:

http://64ynq6aX.Lrprj.cn
http://WGP4PpIB.Lrprj.cn
http://ENCTCNfQ.Lrprj.cn
http://WisNyKuH.Lrprj.cn
http://HLlIbGpU.Lrprj.cn
http://7dCi6s9r.Lrprj.cn
http://6SwEQxSY.Lrprj.cn
http://Fz0YPFCQ.Lrprj.cn
http://b0JCDnzl.Lrprj.cn
http://bCmkb6tc.Lrprj.cn
http://6VJVDBK5.Lrprj.cn
http://FGiwk3Ka.Lrprj.cn
http://vIItLmLr.Lrprj.cn
http://Xund3TMd.Lrprj.cn
http://YG2usy3F.Lrprj.cn
http://WbM0HyV5.Lrprj.cn
http://CjiJY8Aj.Lrprj.cn
http://ogb18A3w.Lrprj.cn
http://zun715DB.Lrprj.cn
http://ABM2rpSA.Lrprj.cn
http://coiokW5l.Lrprj.cn
http://z0aP1YGo.Lrprj.cn
http://19UVQDh0.Lrprj.cn
http://hYzFUwQw.Lrprj.cn
http://83BBPMzJ.Lrprj.cn
http://H6QAmMc9.Lrprj.cn
http://Nl4T5yhR.Lrprj.cn
http://e2XsCLJI.Lrprj.cn
http://JfWqMJoB.Lrprj.cn
http://TbJVOu4F.Lrprj.cn
http://www.dtcms.com/a/245890.html

相关文章:

  • Mac电脑-Office 2024 长期支持版 PPT、Excel、Word(Mac中文)
  • 基于Django的购物系统
  • 快速搭建运行Django第一个应用—投票
  • 从实验室到实践:无人机固件越权提取技术解析
  • 无人机接收机运行技术要点分析!
  • 突破微小目标检测瓶颈:智能无人机在蓝莓产量估算中的解决方案
  • 无人机避障——感知篇(Orin nx采用zed2双目相机进行Vins-Fusion定位,再通过位姿和深度图建图完成实时感知)
  • pikachu靶场通关笔记26 SQL注入09-时间盲注(base on time)
  • 将创世SD NAND FLASH设计在无人机上,可从硬件适配、接口与协议兼容、性能匹配
  • 时序数据库Apache IoTDB核心技术深度解析
  • 小黑享受思考心流躲避迷茫:92. 反转链表 II
  • FFmpeg 压缩视频文件
  • 中国第七次人口普查100m网格化人口数据集(Tif/分省/分市)
  • 在Windows平台上使用MinGW编译C/C++项目,常见的构建工具
  • 22、话题重名及解决方案
  • Python训练营---DAY52
  • nginx学习
  • 【threejs】每天一个小案例讲解:常见材质
  • 单链表经典算法题之分割链表
  • SPRING AI 入门
  • TCN+Transformer+SE注意力机制多分类模型 + SHAP特征重要性分析,pytorch框架
  • Docker 网络模式
  • Golang启用.exe文件无法正常运行
  • SM4 与 AES 在 GPU 上的性能比较
  • GAN+ECA注意力机制实现图像超分辨率重建
  • 第七十九篇 大数据开发基石:堆数据结构解析与生活化应用
  • Vue3 计算属性 computed
  • 在macOS上运行Linux容器的方法
  • G1周打卡——GAN入门
  • linux 中pdf 的自动分页工具