有一个函数,可以在并行计算中计算出最常见的名字(Human[] people
)。但是会存在数据竞争问题。为什么呢?
Map<String, Integer> nameMap = new ConcurrentHashMap<>();
Arrays.stream(people)
.parallel()
.filter(p -> p.isAdult())
.map(Human::getName)
.forEach(p -> nameMap.put(p, nameMap.containsKey(p) ? nameMap.get(p) + 1 : 1));
return nameMap.entrySet().parallelStream().max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1).get().getKey();
groupingByConcurrent
收集器,因为简单的groupBy
会使用更重的合并操作。不过需要进行测试。 - M. Prokhorovcounting()
,因此合并每个公共键的单个添加操作可能比在累加键时允许争用要便宜得多。然而,不使用并行处理执行操作比两种并行变体都更快,因为您需要一个非常大的输入数据集才能从并行处理中获得好处。 - HolgerEntry.comparingByValue()
替换Comparator.comparing(Entry::getValue)
。 - Holger