gpt4 book ai didi

concurrency - 并行流

转载 作者:行者123 更新时间:2023-12-01 13:21:28 27 4
gpt4 key购买 nike

有一个函数,可以并行计算出现频率最高的名字(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();

最佳答案

因为您正在执行一个get,然后递增,然后一个put;中间有人可能已经将该条目放入 nameMap

你可以在这里使用原子的 ConcurrentHashMap#merge,或者更好地使用 Collectors.toConcurrentMap

编辑

你本可以做得更清楚一点:

  Arrays.stream(people)
.parallel()
.filter(Human::isAdult)
.collect(Collectors.groupingBy(Human::getName, Collectors.counting()))
.entrySet()
.stream()
.max(Comparator.comparing(Entry::getValue))
.map(Entry::getKey)
.get();

请注意,我几乎可以确定您根本不需要parallel

关于concurrency - 并行流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49671474/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com