您的位置:首页 > 大数据 > 人工智能

为什么wait()一定要放在循环中

2017-10-26 20:15 162 查看
在多线程的编程实践中,wait()的使用方法如下:

synchronized (monitor) {
//  判断条件谓词是否得到满足
while(!locked) {
//  等待唤醒
monitor.wait();
}
//  处理其他的业务逻辑
}
1
2
3
4
5
6
7
8
[/code]

那为什么非要while判断,而不采用if判断呢?如下:

synchronized (monitor) {
//  判断条件谓词是否得到满足
if(!locked) {
//  等待唤醒
monitor.wait();
}
//  处理其他的业务逻辑
}
1
2
3
4
5
6
7
8
[/code]

这是因为,如果采用if判断,当线程从wait中唤醒时,那么将直接执行处理其他业务逻辑的代码,但这时候可能出现另外一种可能,条件谓词已经不满足处理业务逻辑的条件了,从而出现错误的结果,于是有必要进行再一次判断,如下:

synchronized (monitor) {
//  判断条件谓词是否得到满足
if(!locked) {
//  等待唤醒
monitor.wait();
if(locked) {
//  处理其他的业务逻辑
} else {
//  跳转到monitor.wait();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
[/code]

而循环则是对上述写法的简化,唤醒后再次进入while条件判断,避免条件谓词发生改变而继续处理业务逻辑的错误。

转载:http://blog.csdn.net/yiifaa/article/details/76341707
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息