我只是想寫一個例子的競爭條件:一個簡單的Java競爭條件
MyParallelClass.java:
public class MyParallelClass implements java.lang.Runnable {
public int counter = 0;
@Override
public void run() {
if (test.globalVar > 0) {
for (int i = 0; i < 1000000; i++) {
counter++;
}
test.globalVar--;
}
}
}
test.java:
public class test {
public static int globalVar;
public static void main(String[] args) {
globalVar = 1;
MyParallelClass a = new MyParallelClass();
MyParallelClass b = new MyParallelClass();
new Thread(a).start(); // Thread A
new Thread(b).start(); // Thread B
System.out.println(globalVar);
}
}
我以爲會發生:
如果線程A在線程B啓動之前完全執行,我認爲這可以輸出0
。
變量test.globalVar
也能拿操作是這樣的:
Thread A - Thread B
checks if (globalVar > 0)
looping ... checks if (globalVar > 0)
looping ... execute all four bytecode commands of "test.globalVar--;"
execute test.globalVar--;
所以test.globalVar
的價值將是-1
。
因此,任何一個if語句都會被執行或者兩者都執行。
實際發生的事情:
我0
和1
爲主要手段的輸出。爲什麼我得到0
和1
而不是0
和-1
?
線程執行的順序不能保證。這是在操作系統上的憐憫。 – kosa 2012-07-30 19:35:01
我的0和1是什麼意思?你是否試圖在main的System.out.println(globalVar)之外的地方打印globalVar? – 2012-07-30 19:35:37
嘗試在打印globalVar之前連接兩個線程。在兩個線程都有機會完成之前,您可能已經到達主要方法的最後一行。如果1結束,則以0結束,如果兩次都沒有完成,那麼您得到1。 – 2012-07-30 19:36:34