java多线程问题,java 编程思想书中的例子

在看java编程思想书中的多线程一节,书中对wait,notify,notifyall举了一个例子,模拟给汽车涂蜡和抛光的过程,
因为抛光任务在涂蜡之前是不能尽兴的,反之,涂蜡任务在涂另外一层蜡之前,必须要等抛光任务结束。代码如下:
显示一个汽车类:
class Car{
private boolean wanOn=false;
public synchronized void waxed(){
waxOn=true;
notifyAll();
}
public synchronized void buffed(){
waxOn=false;
notifyAll();
}
public synchronized void waitForWaxing(){
while(waxOn==false){
wait();
}
}
public synchronized void waitForBuffint(){
while(waxOn==true){
wait;
}
}
}
我想知道为什么在waitForWaxing和waitForBuffint方法中,需要用while循环,而不是
用if来进行判断呢?
谢谢

1个回答

notifyAll()是唤醒所有等待的任务,但每次都只有一个能满足,所以必须循环去判断。如果用if的话,醒来一次后不管条件有没有满足,方法都会结束,达不到目的。

wohenni0931
wohenni0931 回复qweasdzxc456123: 以waitForWaxing为例,具体执行的条件是waxOn为true(你这里没有具体操作)。假设进入判断时waxOn为false,那么方法会在wait处等待,直到被唤醒。唤醒后如果waxOn还是为false,用while就会再次判断条件进入等待,如果用if唤醒后就继续执行具体操作(即使条件不成立)
4 年多之前 回复
qweasdzxc456123
jiqi323 你的意思是有很多线程在争用这个car对象锁,这个循环是在循环这些线程吗?
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问