【发布时间】:2015-08-20 12:47:43
【问题描述】:
我对以下代码有疑问。在这种情况下,我希望静态变量“a”和“b”都会发生竞争条件,并且期望这两个变量的输出都小于 1000。但是,当我执行以下代码时,没有观察到预期的行为显示,即 b 的输出始终为 1000。但是,当我取消注释用箭头标记的行并执行以下代码时,两个变量都观察到竞争条件,即变量“a”和“b”的输出是少于1000。同样需要帮助。如果我错过或忽略了线程的任何基本或基本概念,请原谅我,考虑到我仍然是 Java 线程的新手!!!
public class SampleRace {
public static void main(String[] args) {
// TODO Auto-generated method stub
SampleRace1 a = new SampleRace1();
SampleRace1 b = new SampleRace1();
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(SamapleLoop.a); // <---------------------
System.out.println(SampleRace1.b);
}
}
class SamapleLoop {
public static int a = 0;
public static void loop() {
a++;
}
}
class SampleRace1 implements Runnable {
public static int b = 0;
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 1; i <= 500; i++) {
//SamapleLoop.loop(); // <------------------------
b++;
}
}
}
【问题讨论】:
-
我测试了你的代码,事实上,在我第三次尝试注释掉箭头线时,我实际上得到了竞争条件。
标签: java multithreading race-condition