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

java 虚拟机循环优化 导致死循环

java 虚拟机循环优化 导致死循环

PIPIONE 2019-03-13 18:19:58
我打算测试多线程情况下一个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) < 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),哪位知道这个问题的主要原因?求指导.
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

问题已经解决,主要原因是因为在多线程状况下并且程序在死循环没有任何“休眠/等待”造成当前线程无法检测到变量的值被另一个线程改变。

我是在看了<深入理解Java内存模型>之后明白的


查看完整回答
反对 回复 2019-04-30
?
慕慕森

TA贡献1856条经验 获得超17个赞

jdk1.6实测,没有发现LZ说的问题

另外,我也没有在代码里发现问题,这是一个测试多线程++并发数据安全的实例,没有发现问题


查看完整回答
反对 回复 2019-04-30
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

我是指程序无法执行if语句内的代码


查看完整回答
反对 回复 2019-04-30
  • 3 回答
  • 0 关注
  • 523 浏览

添加回答

举报

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