并行流需满足数据量≥10⁵或≥CPU核数×1000、单元素耗时≥1ms才可能提速;操作须无状态无副作用;优先选用ArrayList、数组等高效分割源;按任务类型调优并行度,避免盲目使用。

并行流不是“一开就快”,它通过 ForkJoinPool 把数据分片、多线程并行执行,再合并结果,真正提速需要匹配硬件能力与任务特征。盲目调用 parallelStream() 可能更慢,甚至出错。
数据量和单元素耗时要够“重”
小数据或轻量操作反而拖慢速度:
- 集合元素数建议 ≥ 10⁵(十万级),或至少 ≥ CPU 核心数 × 1000(如 8 核机器,至少 8000 条);
- 单个元素处理时间最好 ≥ 1ms——比如正则校验、JSON 解析、数值变换等;简单
n % 2 == 0这类操作并行后常变慢; - 低于阈值时,分片、线程调度、结果合并的开销会盖过计算收益。
操作必须无状态、无副作用
并行流不保证执行顺序,也不做同步保护:
- 安全操作:
filter、map、reduce(配合不可变累加器)、collect(用Collectors.toList()或toConcurrentMap()); - 危险操作:在
forEach中往ArrayList添加元素、更新静态计数器、写日志、调用数据库; - 错误示例:
numbers.parallelStream().filter(...).forEach(list::add)→ 可能丢数据或抛ConcurrentModificationException; - 正确替代:
.collect(Collectors.toList())或 Java 16+ 的.toList()。
选对数据源和基础类型
底层分割效率直接影响并行效果:
立即学习“Java免费学习笔记(深入)”;
- 优先用
ArrayList、数组、IntStream、LongStream——它们有高效Spliterator.trySplit()实现; - 避开
LinkedList、Stream.generate()、自定义未重写分割逻辑的集合——并行时可能退化为串行; - 处理整数/长整型时,用
int[]+Arrays.stream(...).parallel(),比List<Integer>+parallelStream()快约 30%~40%,避免装箱拆箱。
按场景调优并行度和线程池
默认 ForkJoinPool.commonPool() 并行度 = CPU 逻辑核数 − 1,未必最优:
- CPU 密集型任务:可设为
Runtime.getRuntime().availableProcessors(); - I/O 等待较多时,不宜直接用 parallelStream,应改用
CompletableFuture配合自定义线程池; - 需隔离资源或精细控制:显式创建
ForkJoinPool,提交并行流任务; - 全局调整(慎用):
System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "12")。



















