gpt4 book ai didi

java - 如何在一个读/写线程和一个只读线程之间同步映射?

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:59 25 4
gpt4 key购买 nike

我有一个由线程 A 读取和更新的同步映射(通过 Collections.synchronizedMap())。线程 B 仅通过 Map.keySet() 访问映射>(只读)。

我应该如何同步它? docs say那个 keySet() (对于 Collections.synchronizedMap)“不需要在同步块(synchronized block)中”。我可以将线程 A 的读/写访问放在同步块(synchronized block)中,但这是否有必要?

我想如果 Map.keySet 不需要同步(根据上面的文档链接),甚至使用同步 Map 或同步块(synchronized block)对我来说似乎很奇怪......

更新:我错过了 keySet 的迭代必须同步,即使检索 keySet 不需要同步。拥有 keySet 而无法查看它并不是特别令人兴奋,因此最终结果 = 需要同步。改用 ConcurrentHashMap。

最佳答案

要制作真正的读/写与读/只锁定 Map 包装器,您可以查看 Collections 用于 synchronizedMap() 的包装器 并将所有 synchronized 语句替换为 ReentrantReadWriteLock。这是一项很好的工作。相反,您应该考虑改用 ConcurrentHashMap它在那里做所有正确的事情。

keySet() 而言,它不需要位于 synchronized block 中,因为它已经被 synchronized Collections.synchronizedMap()。 Javadocs 只是指出,如果您正在遍历 map ,则需要对其进行同步,因为您正在进行多项操作,但在获取 keySet() 时不需要同步> 它被包装在一个 SynchronizedSet 类中,该类进行自己的同步。

最后,您的问题似乎暗示您不需要同步某些内容,如果您只是阅读它。您必须记住,同步不仅可以防止竞争条件,还可以确保每个处理器正确共享数据。即使您以只读方式访问 Map,如果有任何其他线程正在更新它,您仍然需要对其进行同步。

关于java - 如何在一个读/写线程和一个只读线程之间同步映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12080086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com