相关疑难解决方法(0)

并行流,收集器和线程安全

请参阅下面的简单示例,该示例计算列表中每个单词的出现次数:

Stream<String> words = Stream.of("a", "b", "a", "c");
Map<String, Integer> wordsCount = words.collect(toMap(s -> s, s -> 1,
                                                      (i, j) -> i + j));
Run Code Online (Sandbox Code Playgroud)

最后,wordsCount{a=2, b=1, c=1}.

但我的流非常大,我想要并行工作,所以我写道:

Map<String, Integer> wordsCount = words.parallel()
                                       .collect(toMap(s -> s, s -> 1,
                                                      (i, j) -> i + j));
Run Code Online (Sandbox Code Playgroud)

但是我注意到这wordsCount很简单HashMap所以我想知道我是否需要明确要求并发映射以确保线程安全:

Map<String, Integer> wordsCount = words.parallel()
                                       .collect(toConcurrentMap(s -> s, s -> 1,
                                                                (i, j) -> i + j));
Run Code Online (Sandbox Code Playgroud)

非并发收集器是否可以安全地与并行流一起使用,还是在从并行流收集时只应使用并发版本?

java parallel-processing concurrency java-8 java-stream

39
推荐指数
3
解决办法
1万
查看次数