程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 多線程-java 虛擬機循環優化 導致死循環

多線程-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) < 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),
哪位知道這個問題的主要原因?求指導.

最佳回答:


問題已經解決,主要原因是因為在多線程狀況下並且程序在死循環沒有任何“休眠/等待”造成當前線程無法檢測到變量的值被另一個線程改變。

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved