競合状態の例を書きたかっただけです:
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);
}
}
私が起こると思ったこと:
0
スレッドBが開始する前にスレッドAが完全に実行された場合、これはどちらかを出力できると思いました。
変数は、次の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 ステートメントのいずれか、または両方が実行されます。
実際に起こったこと:
main メソッドの出力としてとを取得0
しました。andではなくand1
を取得するのはなぜですか?0
1
0
-1