在并行流 Java 中定义映射 [已关闭]

Defining a Map inside a Parallel Stream Java [closed]

提问人:Ragin P M 提问时间:11/15/2023 更新时间:11/15/2023 访问量:53

问:


想改进这个问题吗?更新问题,以便可以通过编辑这篇文章来用事实和引文来回答。

9天前关闭。

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

public void getAllPossibleRoute(ImmutableMap<String, ImmutableMap<String,ImmutableList<Object>>> myImmutableMap) {
        ImmutableList<String> demandLocationCodes = getDemandLocationCodes(demandList);
    demandLocationCodes.parallelStream().forEach(demandLocationCode -> {
         MutableMap<String,Double> costMap = new UnifiedMap();
    });
}

在并行迭代中,我定义了一个名为“costMap”的地图。我的问题是线程安全吗?我应该将其定义为“ConcurrentHashMap<>()”吗?

即使它是线程安全的,在性能方面,哪一个更好?

Java 哈希图 parallelstream

评论

0赞 experiment unit 1998X 11/15/2023
有点重复你之前的问题,但这次它是一个可变的映射,而不是 immutable.it 可能会降低效率,因为如果预先填充了映射(就像你之前的问题一样),在方法运行期间不会有任何对象实例化,这可能会导致 GC。现在您可能有多个映射,并且由于每个映射都已填充,具体取决于添加到每个映射的元素数量,需要调用哈希映射的内部方法以确保有足够的空间,现有元素可能必须切换索引等
0赞 Ragin P M 11/15/2023
@experimentunit1998X,谢谢。

答:

0赞 0x150 11/15/2023 #1

由于您正在为 forEach 使用者中的每个元素定义一个新映射,因此它是完全线程安全的,因为访问它的唯一线程是当前处理流中元素的线程。

如果要在 forEach 使用者之外定义映射,则通过多个线程访问它可能会导致一些问题。在这种情况下,请使用 ConcurrentHashMap 或其他等效的线程安全实现。