sync.Map 是适合此用例的工具吗?还是 RW 互斥锁更好

Soc*_*134 4 concurrency synchronization go

我正在开发一个 golang 项目,其中树节点存储在地图中以便快速访问。对映射的写入永远不会同时发生(对于每个键,它们只发生一次),但我想与读/写同时读取。我一直在阅读有关sync.Map 和简单使用RWMutex 锁的信息,但我不确定哪一个更适合此用例(或者是否有解决此问题的第3 方包)。有人对方法有建议/有任何资源来阅读不同的选项吗?谢谢你!

Eli*_*sky 8

从使用开始sync.Map。它比自己动手更简单,而且可能会更快。

Map 类型针对两种常见用例进行了优化:(1) 当给定键的条目仅写入一次但读取多次时,如在只会增长的缓存中,或者 (2) 当多个 goroutine 读取、写入和读取时覆盖不相交的键集的条目。在这两种情况下,与与单独的 Mutex 或 RWMutex 配对的 Go Map 相比,使用 Map 可以显着减少锁争用。

这段引用中的情况(1)(来自 的官方文档sync.Map)听起来正是您所需要的。

如果您最终对一段时间的性能不满意,请对其进行基准测试并用更快的解决方案替换缓慢的部分(如果可能)。