当结果是 Map 类型(不是 ConcurrentHashMap)时,执行 "concurrent reduction" 是否有效?

Is performing a "concurrent reduction" productive when the result is of type Map (not ConcurrentHashMap)?

我正在阅读关于 stream 的 Java 文档 https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

Reduction, concurrency, and ordering 部分令人困惑:

我已经在截图中说明了我的问题。简而言之,当结果类型为Map而不是ConcurrentHashMap时,使用并发归约有意义吗?

提前致谢!

Map 是一个接口,而 ConcurrentHashMap 是一个实现。他们试图传达的要点是实现应该能够处理并发 writes/deposits/puts。它应该是线程安全的,因为当并行使用时它将从不同的线程访问。如果您有一个不同的实现,它也是线程安全的,那么可以正常工作。

我想你已经可以读懂 programming to an interface 的意思了,它会帮助你理解这个概念。

在这种情况下,您可以通过执行以下操作之一轻松找到 return 类型

代码

List<Integer> integers = List.of(1, 2, 3);

Map<Integer, List<Integer>> sequential = integers.stream().collect(Collectors.groupingBy(Function.identity()));
System.out.println("sequential.getClass() = " + sequential.getClass());

Map<Integer, List<Integer>> parallel = integers.parallelStream().collect(Collectors.groupingByConcurrent(Function.identity()));
System.out.println("parallel.getClass() = " + parallel.getClass());

版画

sequential.getClass() = class java.util.HashMap
parallel.getClass() = class java.util.concurrent.ConcurrentHashMap

表示确实使用了ConcurrentHashMap

JDK 来源

可以看到使用的实现是ConcurrentHashMap

public static <T, K> Collector<T, ?, ConcurrentMap<K, List<T>>>
    groupingByConcurrent(Function<? super T, ? extends K> classifier) {
        return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList());
    }

但请注意这一点,因为它将来可能会更改为另一种实现方式。这在 Collector

的 javadoc 中非常清楚

There are no guarantees on the type, mutability, or serializability of the ConcurrentMap or List objects returned, or of the thread-safety of the List objects returned.