【发布时间】:2013-04-12 19:36:35
【问题描述】:
当我遇到一个使用等待/通知方法的示例时,我正在查看 Kathy Sierra 书中的线程一章:
class ThreadA {
public static void main(String [] args) {
ThreadB b = new ThreadB();
b.start();
synchronized(b) {
try {
System.out.println("Waiting for b to complete...");
b.wait();
} catch (InterruptedException e) {}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total;
public void run() {
synchronized(this) {
for(int i=0;i<100;i++) {
total += i;
}
notify();
}
}
}
运行代码总是产生相同的输出:
等待 b 完成...总计:4950
我在 ThreadB 中修改了 run() 的同步块,添加了:
System.out.println("ThreadB is executed");
问题是:为什么我一直得到
“正在等待 b 完成...”
之前
“线程B被执行”
?是不是有可能线程b先于主线程执行?
【问题讨论】:
-
这是一本书的逐字代码?它有一个竞争条件......
-
这段代码在很多层面上都很愚蠢,很难知道从哪里开始。这真的是出自出版书籍吗?令人兴奋。
-
没有竞争条件---
b == this。但它几乎无法挽救这一天。 -
关于相同示例代码的问题:java and synchronization
-
@TedHopp 我不同意。比赛危险仅仅是程序的结果取决于不可预测的事件的情况。在这种情况下,我们无法保证执行顺序,因此;种族危险。
标签: java thread-safety race-condition