Skip to content
Go 并发与运行时 · 第 4 篇 / 共 4 篇
领域编程与框架
专题Go 专题
当前序列Go 并发与运行时
阅读位置第 4 篇 / 共 4 篇当前专题第 1 个序列 / 共 3 个序列

Go 里的 Mutex、RWMutex、Atomic 怎么选

先说结论

  • 普通共享状态保护,优先从 Mutex 开始想
  • 读远多于写、临界区很短时,RWMutex 才更可能有价值
  • Atomic 更适合非常简单、非常明确的原子读写,不适合承载复杂共享状态

一、三者分别更像什么

1. Mutex

最直接,也最稳。
它的思路就是:这段共享资源同一时刻只让一个协程进来。

优点:

  • 语义清晰
  • 不容易误用
  • 适合大多数共享状态保护

2. RWMutex

它把读锁和写锁分开。
适合:

  • 读很多
  • 写很少
  • 临界区很短

但它不是天然更快,因为:

  • 写锁会阻塞所有读
  • 竞争模式复杂时收益未必明显

3. Atomic

它更像“极小粒度的无锁原子操作工具”。

适合:

  • 计数
  • 状态位
  • 指针切换

但前提通常是:
你操作的是一个很小、很明确的共享值。

二、为什么很多场景先考虑 Mutex 就够了

因为多数并发问题真正麻烦的不是“锁慢不慢”,而是:

  • 共享状态边界清不清楚
  • 有没有遗漏加锁
  • 是否出现竞态

在这几件事上,Mutex 往往最直接。

如果一上来就为了“更高性能”去拆成 RWMutex 或 Atomic,反而更容易把代码复杂度抬高。

三、什么时候 RWMutex 才真的值得

更适合下面这类场景:

  • 缓存 map 读很多,写很少
  • 配置快照高频读、低频更新
  • 查询操作远大于修改操作

但要注意,只有在读写比例真的明显失衡时,它才更可能带来收益。

四、Atomic 最容易被高估在哪里

很多人看到它“无锁”,就容易觉得它一定更高级。
其实它更适合的是:

  • 一个整数
  • 一个布尔状态
  • 一个指针引用

一旦你要保护的是:

  • 多字段对象
  • 复合状态
  • 需要多个步骤一起一致

Atomic 就不再自然了。

五、最容易踩的坑

1. 读多写少判断失误,盲目上 RWMutex

实际写并不少时,RWMutex 可能并没有明显收益。

2. 用 Atomic 保护复杂对象

单个字段原子了,不代表整个业务状态一致了。

3. 把并发问题理解成“锁种类问题”

很多性能问题根因其实是共享状态设计不合理,不是该换哪种锁。

总结

Go 里的 MutexRWMutexAtomic 没有谁天然更强。大多数场景先从 Mutex 开始,读远多写少再看 RWMutex,共享值极小且语义明确时再用 Atomic,这套顺序通常更稳。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 回看前文会更完整context 的超时、取消和传播边界适合把 goroutine、channel、context 和锁选择放到一起理解。Go 专题 · Go 并发与运行时同一序列 · 回看前文会更完整有缓冲 channel 和无缓冲 channel 怎么选适合把 goroutine、channel、context 和锁选择放到一起理解。Go 专题 · Go 并发与运行时同专题其他序列 · Go 并发模型与服务工程化context 传递截止时间和链路信息的边界适合把 goroutine 生命周期、context 边界、接口抽象和优雅停机放回 Go 服务实践里思考。Go 专题 · Go 并发模型与服务工程化同专题其他序列 · Go 工程实践与内存治理Go 服务项目目录怎么组织更稳适合把逃逸分析、GC、错误处理和项目布局放在一条工程主线上看。Go 专题 · Go 工程实践与内存治理跨专题关联 · 同场景:方案选型半同步复制和异步复制怎么选适合把 next-key lock、一致性读、复制延迟和分库分表边界放回同一条一致性主线上判断。MySQL 专题 · MySQL 事务、锁与高可用边界跨专题关联 · 同场景:方案选型分词器、Tokenizer 和 IK 到底怎么选适合把分词、复杂查询和深分页放到一起深入看。Elasticsearch 专题 · Elasticsearch 查询与分析细节
继续阅读Go 并发与运行时当前序列第 4 篇 / 共 4 篇当前专题第 1 个序列 / 共 3 个序列
往前看
上一篇context 的超时、取消和传播边界回到当前序列上一章上一序列MyBatis 性能与写入治理从第 1 篇开始:MyBatis 分页插件和 Count 优化
往后看
下一序列Go 工程实践与内存治理从第 1 篇开始:Go 逃逸分析怎么影响性能

把零散经验整理成可查、可复用、可持续更新的企业级知识门户