我正在看一些通知/等待的例子,并遇到这一个。我明白一个同步块基本上定义了一个关键部分,但是这不是一个竞争条件?没有指定首先输入哪个同步块。每个网站在这个例子中是否存在竞争条件?如果是这样,怎么可能避免?
public 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){
e.printStackTrace();
}
System.out.println("Total is: " + b.total);
}
}
}
class ThreadB extends Thread {
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
}
输出:
等待B来完成...
总计为:4950
是的,理论上新线程可以在主线程调用wait()之前'notify()'。 – overthink
不要将'synchronized'块视为_preventing_种族。它仅仅限制了比赛的胜利。这就像汽车竞赛场地的一部分,赛道太狭窄,汽车相互超车。他们仍在比赛中,但他们必须通过单节档案。 “同步”模块同样如此:线程不在这里竞赛__,但他们竞争_get here_,并且他们在其他地方跑。 –
@ jameslarge这是一个惊人的比喻!同步块中不能同时存在两个线程,但除非明确指定,否则无法告诉谁可以先到达,是正确的? – trevalexandro