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

为何System.out.println会改变Java多线程并发测试结果?

多线程并发中System.out.println影响结果的原因分析

我正在测试一个多线程并发问题,由于未做同步,预期quantity结果可能小于0(非必然)。测试中发现,通过if(doPrintln)控制的System.out.println开关会改变测试结果:关闭时结果为1,不符合预期;开启时结果为-2499。请问为何调用System.out.println会持续改变结果?

原因解析

这是CPU核心缓存导致的内存可见性问题:

  • 关闭System.out.println时,线程频繁操作的是CPU核心缓存里的quantity副本,没有及时同步到主内存。各个线程无法感知其他线程对quantity的修改,最终计算结果偏离预期。
  • 开启System.out.println时,该方法内部自带synchronized同步锁(查看JDK源码可知,PrintStream的println方法会持有对象锁)。执行IO操作触发的上下文切换,会强制把CPU缓存中的数据同步到主内存,同时让其他线程读取到主内存的最新值,多线程对quantity的修改能被正确感知,也就出现了预期的负数结果。

修复方案

给quantity变量添加volatile关键字,强制线程每次读写都直接操作主内存,保证内存可见性;也可以使用synchronized同步块、AtomicInteger原子类等方式,从根本上解决线程安全问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:02:32