并行流、收集器和线程安全性

12 浏览
0 Comments

并行流、收集器和线程安全性

看下面的简单示例,它统计了列表中每个单词出现的次数:

Stream words = Stream.of("a", "b", "a", "c");
Map wordsCount = words.collect(toMap(s -> s, s -> 1,
                                                      (i, j) -> i + j));

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

但是我的流非常大,我想并行化任务,所以我写了如下代码:

Map wordsCount = words.parallel()
                                       .collect(toMap(s -> s, s -> 1,
                                                      (i, j) -> i + j));

然而我注意到wordsCount是一个简单的HashMap,所以我想知道是否需要显式地要求一个并发映射以确保线程安全:

Map wordsCount = words.parallel()
                                       .collect(toConcurrentMap(s -> s, s -> 1,
                                                                (i, j) -> i + j));

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

0