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

Java多线程使用AtomicLong计数结果不符合预期的原因查询

问题根因

你遇到的输出结果异常和AtomicLong的线程安全性无关,核心原因是主线程没有等待工作线程执行完计数加1操作,就提前读取了count的值做输出。

两个测试方法的具体问题说明:

  • name2测试方法:
    调用t1.start()、t2.start()只是向操作系统提交了线程启动的请求,并不会阻塞主线程等待这两个线程的任务执行完成。主线程启动两个线程后会立刻执行System.out.println(myCounter.count),此时可能出现两个工作线程都没执行、仅执行了一个、全部执行完成三种情况,对应输出0、1、2三种结果,你遇到的输出1就是仅完成了一个线程的增量操作的场景。
  • name3测试方法:
    ExecutorService.execute()只是把任务提交到线程池的待执行队列,不会阻塞主线程等待任务执行结束。主线程提交完两个任务后直接读取count输出,同样会出现提前读取的问题,结果和name2一致。
修复方案

如果要保证输出结果稳定为2,需要在输出前添加等待所有工作线程执行完成的逻辑:

  • 针对name2方法:启动线程后追加t1.join()、t2.join(),等待两个线程运行结束后再执行输出
  • 针对name3方法:提交完所有任务后先调用service.shutdown(),再调用service.awaitTermination(1, TimeUnit.SECONDS)等待线程池所有任务执行完成后再输出

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:39:01