并行流、收集器和线程安全性
- 论坛
- 并行流、收集器和线程安全性
21 浏览
并行流、收集器和线程安全性
看下面的简单示例,它统计了列表中每个单词出现的次数:
Streamwords = 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}
。
但是我的流非常大,我想并行化任务,所以我写了如下代码:
MapwordsCount = words.parallel() .collect(toMap(s -> s, s -> 1, (i, j) -> i + j));
然而我注意到wordsCount
是一个简单的HashMap
,所以我想知道是否需要显式地要求一个并发映射以确保线程安全:
MapwordsCount = words.parallel() .collect(toConcurrentMap(s -> s, s -> 1, (i, j) -> i + j));
非并发收集器能否安全地与并行流一起使用,还是只有在从并行流收集时才应使用并发版本?