尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Go 并发原语深入:atomic、Mutext、RWMutex 性能对比

发布时间:2026/9/26 11:00:50

资讯中心
01
ARTICLE

Go 并发原语深入:atomic、Mutext、RWMutex 性能对比

Go 并发原语深入:atomic、Mutext、RWMutex 性能对比
Go 并发原语深入atomic、Mutext、RWMutex 性能对比mutex 在 Go 项目里无处不在。但很多人不知道何时用 mutex、atomic、还是 sync.Map。本文 perf 三剑客对比并给你选型建议。一、atomic最简 最快importsync/atomicvarcounterint64atomic.AddInt64(counter,1)atomic.LoadInt64(counter)二、Mutex临界区保护varmu sync.Mutex mu.Lock()defermu.Unlock()counter三、RWMutex读多写少varmu sync.RWMutex mu.RLock()val:m[key]mu.RUnlock()四、sync.Map特殊场景varm sync.Map m.Store(foo,1)v,ok:m.Load(foo)五、性能对比BenchmarkAtomic-8 5000000 120 ns/op 0 B/op 0 allocs/op BenchmarkMutex-8 500000 1800 ns/op 0 B/op 0 allocs/op BenchmarkRWMutex-R-8 500000 1500 ns/op 0 B/op 0 allocs/op BenchmarkRWMutex-W-8 500000 2000 ns/op 0 B/op 0 allocs/op BenchmarkSyncMap-8 300000 4200 ns/op 480 B/op 6 allocs/opatomic 远胜 mutex。六、原则单标量变量atomic临界区简单atomic 复合自旋结构体复合修改mutex读多写少RWMutexkey 集合大分片明显sync.Map七、自旋锁func(l*Lock)Lock(){for!atomic.CompareAndSwapInt32(l.flag,0,1){runtime.Gosched()}}func(l*Lock)Unlock(){atomic.StoreInt32(l.flag,0)}适合临界区极小且极少阻塞场景。八、TryLockmu.TryLock()// busy?, skip九、Writer Starvation当写入者高频所有 readers 都被饿死。mutex 已内置饥饿机制Go 1.9 改进。十、踩坑清单Mutex 不可复制传值会惊Mutex.Recursive不支持必须互斥调用defer Unlock低频高频用直接 Unlock十一、企业实战订单并发场景typeOrderCachestruct{mu sync.RWMutex datamap[int64]Order}func(c*OrderCache)Get(idint64)(Order,bool){c.mu.RLock();deferc.mu.RUnlock()o,ok:c.data[id]returno,ok}十二、sync.Map 实战key 集合大且稳定写入不太频繁十三、Race Detectorgotest-race./...CI 必开。十四、未来Go 1.24 计划加入 typed atomicsatomic.Int64、atomic.Pointer[T]API 更安全。十五、总结与展望mutex / atomic / sync.Map 没有银弹按场景选择。未来Go 标准库同步原语会变得更安全、更易用。十六、参考文献Go standard library syncpath/to/Licene
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。