当结果是 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.
我正在阅读关于 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
There are no guarantees on the type, mutability, or serializability of the
ConcurrentMap
orList
objects returned, or of the thread-safety of theList
objects returned.