1. Collector 标记为 CONCURRENT 时还需要满足哪些线程安全条件,UNORDERED 特征有何作用
Collector 标记为 CONCURRENT 时还需要满足哪些线程安全条件?UNORDERED 特征有何作用?
- Collector.CONCURRENT 特征
- 线程安全条件
- UNORDERED 特征
Collector 标记为 CONCURRENT 表示"结果容器可被并发修改",允许并行流在多个线程同时累加。但需满足:1)accumulator 必须线程安全(可并发调用,如 ConcurrentHashMap 的 put);2)combiner 可被抛(或返回与 accumulator 一致的结果);3)结果容器必须支持并发修改(如 ConcurrentHashMap、线程安全集合)。若违反(如用普通 HashMap 但标 CONCURRENT),并行累加会产生竞态/丢数据。UNORDERED 特征表示"结果不依赖输入顺序",允许并行流优化(跳过顺序合并、减少屏障),并行执行更快。CONCURRENT 省去合并(各线程直接累加同一容器),UNORDERED 允许无序处理提升并行度。
CONCURRENT 要求累加器线程安全(容器并发可用),UNORDERED 允许无序处理优化并行。二者联合让并行流高效且安全。
// 线程安全条件 + UNORDERED
Collector<T, ?, ConcurrentHashMap<K,V>> c = Collectors.toConcurrentMap(
keyFn, valFn, mergeFn, ConcurrentHashMap::new); // 容器线程安全
// 自定义 collector 标注 CONCURRENT + UNORDERED 时需保证线程安全