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

为什么Java中synchronized关键字不配合join()使用时无法得到预期结果

原因说明

你对synchronized关键字的作用理解是正确的:static synchronized修饰的方法会以当前类对象为锁,保证同一时间只有一个线程能进入方法执行,counter++操作的原子性是有保障的,只要两个线程都执行完全部100次循环,最终counter的结果一定是200。

结果不符合预期的核心问题出在主线程的执行时机:

  • 调用t1.start()、t2.start()只是告诉CPU这两个线程可以开始调度了,并不会立刻让两个线程执行完全部代码,两个线程的执行是异步的,和主线程并行运行
  • 注释掉join()方法后,主线程不会阻塞等待t1、t2执行完成,执行完process()方法后会立刻运行System.out.println("Couter value "+counter)语句
  • 打印执行时,t1、t2大概率还没有执行完全部200次累加操作,甚至可能还没开始执行任何一次increment(),所以最终输出的数值会小于200,极端场景下甚至会输出0。

你可以做个简单验证:在main方法调用process()之后、打印之前加一行Thread.sleep(1000),给两个子线程留足执行时间,大概率就能拿到200的预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 23:27:03