任意类型指针 2013-09-29 11:25 采纳率: 100%
浏览 2678
已采纳

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) < 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条回答

  • 任意类型指针 2013-11-04 10:16
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题