在多线程的编程实践中,wait()的使用方法如下:
synchronized (monitor) {
//判断条件是否得到满足
while(!locked) {
//等待唤醒
monitor.wait();
}
//业务逻辑
.......
}
那为什么非要while判断,而不采用if判断呢?
synchronized (monitor) {
//判断条件是否得到满足
if(!locked) {
//等待唤醒
monitor.wait();
}
//业务逻辑
......
}
如果采用if判断,当线程从wait中唤醒时,那么将继续处理它的业务逻辑,但这时候可能出现另外一种可能,这个时候可能我们的条件已经不满足了,但是我们的代码已经执行到了 业务逻辑出,已经不可能回去判断我们的逻辑了,我们需要再判断一次
synchronized (monitor) {
//判断条件是否得到满足
if(!locked) {
//等待唤醒
monitor.wait();
//再判断一次
if(locked) {
//业务逻辑
} else {
// 跳转到monitor.wait();
}
}
}
但是 while 会在 执行我们的业务逻辑之前,先判断一下我们的循环条件是否成立,这就跟我们上面 if 写的代码类似