【问题标题】:Is sync.Map the right tool for this use case? Or is a RW mutex lock bettersync.Map 是适用于这个用例的正确工具吗?还是RW互斥锁更好
【发布时间】:2020-08-04 21:02:29
【问题描述】:

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

【问题讨论】:

  • The docs for sync.Map 非常清楚地解释了何时使用您自己的锁定或协调的常规地图是有益的:地图类型针对两种常见用例进行了优化:(1)当给定的条目key 只会被写入一次,但会被读取多次,例如在只会增长的缓存中,或者 (2) 当多个 goroutine 读取、写入和覆盖不相交的键集的条目时。
  • 看起来 sync.Map 是适合这项工作的工具

标签: go concurrency synchronization


【解决方案1】:

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

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

此引用中的案例 (1)(来自sync.Map 的官方文档)听起来正是您所需要的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2013-01-17
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多