多线程:为什么wait()需要放在循环中?
举个栗子:
synchronized (monitor) {// 判断条件谓词是否得到满足while(!locked) {// 等待唤醒monitor.wait();}// 处理其他的业务逻辑
}
那为什么非要while判断,而不采用if判断呢?如下:
synchronized (monitor) {// 判断条件谓词是否得到满足if(!locked) {// 等待唤醒monitor.wait();}// 处理其他的业务逻辑
}
这是因为,如果采用if判断,当线程从wait中唤醒时,那么将直接执行处理其他业务逻辑的代码,但这时候可能出现另外一种可能,条件谓词已经不满足处理业务逻辑的条件了(也即是locked可能已经发生改变),从而出现错误的结果,于是有必要进行再一次判断,如下:
synchronized (monitor) {// 判断条件谓词是否得到满足if(!locked) {// 等待唤醒monitor.wait();if(locked) {// 处理其他的业务逻辑} else {// 跳转到monitor.wait(); }}
}
而循环则是对上述写法的简化,唤醒后再次进入while条件判断,避免条件谓词发生改变而继续处理业务逻辑的错误。
因此可以用double check 或者循环
多线程:为什么wait()需要放在循环中?相关推荐
- oracle双重for循环sql,Oracle 11g中for循环中的PL / SQL限制
我有一个大约有3000万条记录的表,并且我想像这样循环遍历表中存在的记录: FOR i IN (SELECT * FROM tbl_items it Left join location lo ON ...
- R语言循环中break函数和next函数使用实战
R语言循环中break函数和next函数使用实战 目录 R语言循环中break函数和next函数使用实战 #基础for循环 #带break的for循环
- Vue指令之v-for——迭代数组、迭代对象中的属性、迭代数字||v-for循环中key属性的使用
v-for循环普通数组 v-for循环对象数组 v-for循环对象 v-for迭代数字 v-for循环中key属性的使用 <!DOCTYPE html> <html lang=&qu ...
- html页面如何循环遍历,遍历foreach循环中的HTML DOM元素
5 个答案: 答案 0 :(得分:3) 您可以使用closest('tr')查找最近的父tr元素,然后使用index()获取行号.试试这个: $('td').click(function() { va ...
- matlab for 取数组,for循环中的MATLAB和单元格数组处理
for循环中的MATLAB和单元格数组处理 我是MATLAB新手,想从数据库中提取一个单元格数组中的数据: sensors = [ 1] [23] [1] [ 0] [0.1000] [1x29 ch ...
- [vue] v-for循环中key有什么作用?
[vue] v-for循环中key有什么作用? 四个字: 性能优化,简述: 让vue在更新数据的时候可以更有针对性的 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢 ...
- python循环中的else_python 循环中else的简单示例
导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 众多语言中都有if else这对条件选择组合,但是在python中还有更多else使用的地 ...
- java sleep 循环_while循环中的Thread.sleep()
我注意到NetBeans警告我在我的Java代码中使用while循环中的Thread.sleep(),所以我已经对这个主题进行了一些研究 . 主要问题似乎是性能问题,当计数器仍处于休眠状态时,你的状态 ...
- Python入门--二重循环中的continue和break
#二重循环中的break和continue #二重循环中的break和continue用于控制本层循环 ############################################# fo ...
最新文章
- swift_016(Swift 的闭包)
- 图片相似度识别_deepface:人脸识别\特征分析
- 萌新的Linux的学习之路(十) --ip设置管理
- 服务注册发现consul之五:Consul移除失效服务的正确姿势
- CSLA .NET 3.6支持Silverlight 2
- css H5端多行文本实现省略号
- 幂等问题 vs 如何判断是否是4的幂
- String类的特点和使用步骤
- Mysql执行计划含义,mysql执行计划介绍
- 飞秋2010下载不仅野草是如此
- 关于CleanMyMac常见问题与解答
- linux系统自动获取ip地址,Linux系统怎么自动获取ip地址用什么命令
- [bzoj 5064]B-number
- 海外代理ip池购买推荐,易路s5海外ip代理如何提取使用?
- 公众平台 python_微信公众平台SDK Python
- HTML实现图片360度循环旋转
- Day02| 第四期-阿里巴巴股票行情分析(一)
- 计算机毕业设计Java班费收支管理系统(源码+系统+mysql数据库+lw文档)
- 台式计算机设置事带麦耳机,win10系统的台式电脑耳机(带麦克风的那种)怎么设置?...
- CF 71A [字符串统计]
热门文章
- [Google Guava] 1.5-Throwables:简化异常和错误的传播与检查
- 《敏捷迭代开发:管理者指南》—第2章2.14节推荐读物
- 微软发布.NET Core Tools 1.0版本
- USACO1.1Broken Necklace[环状DP作死]
- 41. First Missing Positive
- UNIX网络编程——TCP/IP简介
- linux DNS服务器配置
- 你需要了解的 C++ 17 Top 19 新特性(附精彩评论)
- socket编程 及select poll epoll示例
- jq 比较两个时间是否在同一天_.NET CORE下最快比较两个文件内容是否相同的方法...