java死循环的退出_java 虚拟机循环优化 导致死循环

我打算测试多线程情况下一个long数值在++的时候是否会有多线程问题,代码如下(jdk版本1.7.0_07):public class A {

private long value = 0;

public long getValue() {

return value;

}

public void add1() {

this.value++;

}

}

public class Test implements Runnable {

private static final long TIME = 50;

private A a;

private long count = 0;

private boolean over = false;

public boolean isOver() {

return this.over;

}

public void setOver(boolean over) {

this.over = over;

}

@Override

public void run() {

long time = System.currentTimeMillis();

do {

count++;

a.add1();

} while ((System.currentTimeMillis() - time) 

this.setOver(true);

System.out.println("over " + a.getValue() + " , count = " + count);

}

public static void main(String args[]) {

A a = new A();

Test t1 = new Test();

Test t2 = new Test();

t1.a = a;

t2.a = a;

new Thread(t1).start();

new Thread(t2).start();

for (; ; ) {//死循环

if (t1.isOver() && t2.isOver()) {//当t1和t2都执行完毕的时候打印并退出

System.out.println(t1.count);

System.out.println(t2.count);

System.out.println(a.getValue());

System.out.println(a.getValue() == (t1.count + t2.count));

break;

}

}

}

}

在运行代码时发现程序无法正常退出,(run函数可以正常执行完毕,但是主线程无法退出,)

我已开始人为我over没有做好,但是检查之后发现Over没有问题,所以我在isOver函数中添加了一行System.out.println(over);

再次测试的时候发现程序可以正常执行完并退出.

我又将System.out.println(over);注释掉后 发现程序又死在那里,

这引起了我的思考,我以为是我ide的问题,接着直接在字符界面使用java命令发现也是这个问题,

然后又换到linux系统下 发现还是如此(linux系统下 jdk1.7.0_40),

哪位知道这个问题的主要原因?求指导.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值