HashMap 的线程安全

Thread Safety of HashMap

提问人:Ragin P M 提问时间:10/20/2023 最后编辑:AbraRagin P M 更新时间:10/20/2023 访问量:89

问:

我有一个并行迭代(Java):

public void getAllPossibleRoute(ImmutableMap<String, ImmutableMap<String,ImmutableList<Object>>> myImmutableMap) {
        ImmutableList<String> demandLocationCodes = getDemandLocationCodes(demandList);
    demandLocationCodes.parallelStream().forEach(demandLocationCode -> {
         do DFS()
    });
}

在并行迭代中,我有一个已经填充的嵌套不可变映射,例如 .我正在阅读这张地图以获取对象内部的值。在这里我可以使用 .我认为只有一个线程可以访问不可变的地图,而我只是在阅读它。如果我使用 ,它会提高性能吗?对于嵌套的操作线程安全吗?ImmutableMap<String, ImmutableMap<String, ImmutableList<Object>>>MutabaleMapMutableMapMap.get(String).get(String).get(0)MutableMap

我正在尝试对一组位置进行深度优先搜索 (DFS),并且对于该组,我正在并行迭代。我确实遇到了大型数据集的性能问题,我需要提高性能。

Java 多线程 不可变性 parallel.foreach

评论

0赞 Volk 10/20/2023
请改进您的问题。读取 Stackoverflow 的规则。使用 Ctrl+K 显示您的代码!
4赞 experiment unit 1998X 10/20/2023
如果您是只读的,并且不修改已填充的哈希映射,则可变或不可变之间应该没有任何区别
1赞 Petr Janeček 10/20/2023
>“你可能只是增加线程数”,parallelStream() 的默认实现已经使用了所有可用的 CPU 减去 1。
1赞 Torben 10/20/2023
@PetrJaneček 为了消除任何可能的混淆,并行流使用所有可用的 CPU。它创建“CPU 数减去 1”的线程,但它也使用主线程来补偿 -1。
3赞 Thomas Kläger 10/20/2023
我认为只有一个线程可以进入不可变映射:不,您将不可变映射与同步混淆了:任意数量的线程都可以从不可变映射中读取数据(由于映射是不可变的,因此不会有任何冲突)。您只需要同步对可变数据结构的访问。

答: 暂无答案