我只是想写一个竞争条件的例子:
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--;
}
}
}
测试.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
如果线程 A 在线程 B 启动之前完全执行,这可能会输出。
该变量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
and1
而不是0
and -1
?