为了账号安全,请及时绑定邮箱和手机立即绑定

下面的代码为什么输出不是1000?

下面的代码为什么输出不是1000?

千巷猫影 2019-04-24 13:15:44
public class ThreadTest {public static void main(String[] args) {     final AtomicInteger atomicInteger = new AtomicInteger(0);     for (int i = 0; i < 1000; i++) {         new Thread(new Runnable() {             @Override             public void run() {                 atomicInteger.getAndIncrement();             }         }).start();     }     System.out.println(atomicInteger.toString()); }}
查看完整描述

5 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

System.out.println(atomicInteger.toString());
运行到这里的时候,线程未必执行完毕了。

查看完整回答
反对 回复 2019-05-16
?
开满天机

TA贡献1786条经验 获得超13个赞

for (int i = 0; i < 1000; i++)这个条件就是小于1000最大回事999


查看完整回答
反对 回复 2019-05-16
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

结果不是1000,是因为你的线程出现了共享数据,就是说在一个时间断上一个线程没结束,下一个线程就来了,也就是用了同一个值,也就是常说的线程不安全问题,java中的解决方案是用同步代码块或是ThreadLocal
换句话就是在这1000次循环中结果是0的执行了N次,结果是9的执行了N次,这样到循环了1000次时,结果肯定不是1000了

查看完整回答
反对 回复 2019-05-16
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

运行结果是1000,代码没有错误啊。再者AtomicInteger这个本来就是线程安全的,就是操作数据不会出现数据没有及时更新的情况。


查看完整回答
反对 回复 2019-05-16
  • 5 回答
  • 0 关注
  • 603 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信