首先一句话总结,之所以用while是因为线程被唤醒后,很可能已经不满足判断条件了,所以要再进行一次条件判断。
例如:
synchronized (monitor) {
//判断条件是否得到满足
if(!locked) {
//等待唤醒
monitor.wait();
}
//业务逻辑
......
}
假如此刻其他线程中调用了notifyall方法,这个被激活线程就会去执行之后的逻辑,但是很可能已经不满足if里面的条件了。
例如,我们设置i<3时,线程等待。如果被notifyall方法唤醒,这个线程就会继续执行,但是,i可能仍然小于3,。所以需要再判断一次,while就很好地满足了这个场景。
synchronized (monitor) {
//判断条件是否得到满足
while(!locked) {
//等待唤醒
monitor.wait();
}
//业务逻辑
.......
}