请参阅下面的简单示例,该示例计算列表中每个单词的出现次数:
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)
非并发收集器是否可以安全地与并行流一起使用,还是在从并行流收集时只应使用并发版本?
我有一个ConcurrentLinkedQueue
由多个线程访问的; 其中的对象是不可变的.在一个线程中,我需要一个数据快照,我正在通过调用stream
它来完成.安全吗?我知道无干扰要求,但它似乎是在讨论从其中一个流操作(" 源流可能不是并发的流管道永远不应修改流的数据源 ")的修改,而不一定是外部的.此外,它ConcurrentLinkedQueue
是专为并发访问而设计的,所以就是这样.