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
相关产品推荐
相关产品推荐

