You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java并行流中forEach()与forEachOrdered()执行速度差异原因求解

问题原因分析
  • 核心瓶颈来自System.out.println的同步开销:System.out是线程安全的PrintStream实现,所有println方法都内置synchronized同步锁,多线程并发调用时会产生大量锁竞争、上下文切换开销,这是本次测试中占比最高的耗时来源。
  • parallel().forEach()的执行逻辑:并行流的forEach不会保留顺序,每个工作线程处理完自己分片内的单个元素后,就会立刻尝试调用println输出,多个线程会持续争抢System.out的锁,10000次输出对应上万次锁竞争,额外开销极高,因此总耗时更长。
  • parallel().forEachOrdered()的执行逻辑:并行流的forEachOrdered需要保证输出顺序和源流顺序一致,因此内部实现是先让各并行线程完成自己分片的元素处理,之后由单线程按全局顺序统一调用println输出,全程没有多线程锁竞争,省掉了大量锁切换、等待的开销,因此总耗时反而更短。

注意:本次测试结果不代表两个API的通用性能表现。你当前的测试用例把IO操作作为最终执行逻辑,瓶颈完全在IO同步上,没有体现流本身的计算性能。如果你把执行逻辑替换为无同步的计算操作(比如元素累加、写入无锁数组等),forEach的性能会明显高于forEachOrdered,符合你原本的预期。

内容的提问来源于stack exchange,提问作者ilovek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 23:54:03