为什么wait()一定要放在循环中
2017-10-26 20:15
162 查看
在多线程的编程实践中,wait()的使用方法如下:
2
3
4
5
6
7
8
[/code]
那为什么非要while判断,而不采用if判断呢?如下:
2
3
4
5
6
7
8
[/code]
这是因为,如果采用if判断,当线程从wait中唤醒时,那么将直接执行处理其他业务逻辑的代码,但这时候可能出现另外一种可能,条件谓词已经不满足处理业务逻辑的条件了,从而出现错误的结果,于是有必要进行再一次判断,如下:
2
3
4
5
6
7
8
9
10
11
12
[/code]
而循环则是对上述写法的简化,唤醒后再次进入while条件判断,避免条件谓词发生改变而继续处理业务逻辑的错误。
转载:http://blog.csdn.net/yiifaa/article/details/76341707
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
相关文章推荐
- wait必须放在while循环里面的原因探析
- Java多线程为什么使用while循环来调用wait方法
- 你是如何调用 wait()方法的?使用 if 块还是循环?为什么?
- wait()为什么放在 while中
- JS一定要放在Body的最底部么?聊聊浏览器的渲染机制
- 为什么一定要了解一种技术的细节
- Hibernate为什么一定要做关联映射?
- 导入的jar包为什么要放在lib文件夹下,你知道么?
- Libs文件夹下的Jar文件为什么不会自动放在Android Private Libraries目录下
- 静态队列为什么必须是循环队列
- 主动关闭TCP连接的一方为什么要有TIME_WAIT状态
- java foreach循环为什么不能赋值
- [one day one question] GIF动画为什么只动一次不能循环
- 探讨OC的内存管理 以及防止循环引用retain cycle 代理为什么用weak block为什么用copy
- hibernate使用关联映射的优劣比较:为什么用Hibernate时一定要做关联映射?
- 为什么建立TCP连接需要三次握手,为什么断开TCP连接需要四次握手,TIME_WAIT状态的意义
- GIT在UNITY开发中的应用之一,为什么多人协作一定要用GIT
- 为什么JAVA要提供 wait/notify 机制?是为了避免轮询带来的性能损失
- 随机数赋值,srand()放在循环体和循环体外的区别
- 为什么script标签要放在body前,而不是head中?