Go大厂面试真题精讲之并发安全Map的实现方案
文章导语
"为什么Go的map不是线程安全的?有哪些并发安全的map方案?各自适用什么场景?"------字节/腾讯/美团高频面试题。
一、map非线程安全的原因
Go设计哲学:将并发安全的选择权交给开发者。内置map不加锁以获得单goroutine场景的最优性能。
二、四种方案对比
方案1: sync.RWMutex + map
读锁(RLock)+写锁(Lock),适合读写都频繁
优点:实现简单 缺点:写锁竞争时性能下降
方案2: sync.Map
读多写少+key集合稳定时表现最优
双空间设计(read+dirty),read无锁访问
方案3: 分片锁Map
将map分N个分片,每个分片独立锁
并发度=N,适合高并发读写
方案4: atomic.Value
适用于整体替换的场景(如配置更新)
不支持增量更新
三、面试回答框架
"Go map非线程安全是刻意的设计选择。并发安全方案按场景选择:读写都频繁用RWMutex,读多写少用sync.Map,高并发用分片锁。"
参考文献
- Go Blog - Go maps in action
- Go源码 sync/map.go
- orcaman/concurrent-map