見簡單的例子,下面計數每個單詞的出現次數的在列表中的號碼:並行流,收藏家和線程安全
Stream<String> words = Stream.of("a", "b", "a", "c");
Map<String, Integer> wordsCount = words.collect(toMap(s -> s, s -> 1,
(i, j) -> i + j));
最後,wordsCount
是{a=2, b=1, c=1}
。
但我流是非常大的,我想parallelise的工作,所以我寫:
Map<String, Integer> wordsCount = words.parallel()
.collect(toMap(s -> s, s -> 1,
(i, j) -> i + j));
但是我注意到,wordsCount
是一個簡單的HashMap
所以我不知道如果我需要明確要求同時地圖,以保證線程安全:
Map<String, Integer> wordsCount = words.parallel()
.collect(toConcurrentMap(s -> s, s -> 1,
(i, j) -> i + j));
可以非併發收集器安全地與並行流使用,或者我應該只使用併發版本從並行流收集什麼時候?