新闻详情

新闻详情

首页 / 资讯中心 / 详情

wait() 为什么要写在 while 循环里?写在 if里不行吗?

发布时间:2026/9/28 20:01:59来源:尧图网络
wait() 为什么要写在 while 循环里?写在 if里不行吗?
为什么wait()必须写在while循环里不能用if1. 防止虚假唤醒Spurious Wakeup线程从wait()返回并不一定是因为被notify/notifyAll通知了操作系统层面可能在线程未收到任何通知的情况下将其唤醒即虚假唤醒。如果使用的是if线程被虚假唤醒后会直接执行条件判断后面的代码而此时条件可能仍然不满足。2. 被notifyAll()唤醒的线程需要重新竞争条件即使没有虚假唤醒使用notifyAll()时会唤醒所有等待线程它们会逐个获取锁并返回。例如经典的生产者-消费者场景多个消费者线程因队列为空而进入等待一个生产者放入一个元素后调用notifyAll()所有消费者线程都被唤醒但只有一个消费者能取到数据用if的话其他消费者取不到数据也会直接往下执行产生错误逻辑标准写法对比❌ 错误写法——用ifsynchronized(obj){if(条件不满足){// 只用 if 判断一次obj.wait();}// 线程被唤醒后直接执行这里 → 条件可能仍不满足对应的逻辑;}✅ 正确写法——用whilesynchronized(obj){while(条件不满足){// 被唤醒后重新检查条件obj.wait();}对应的逻辑;// 条件确实满足时才执行}官方规范说明在Object#wait的规范中明确指出等待方应遵循以下原则获取对象的锁。如果条件不满足那么调用对象的wait()方法被通知后仍要检查条件。条件满足则执行对应的逻辑。这正是while循环要做的事——每次从wait()返回后都重新检查条件而不是只检查一次。真实源码示例在 JDK 的ArrayBlockingQueue#put()方法中也是用while来防止虚假唤醒的publicvoidput(Ee)throwsInterruptedException{checkNotNull(e);finalReentrantLocklockthis.lock;lock.lockInterruptibly();try{// 设计注意点用while不用if是为了防止虚假唤醒while(countitems.length)notFull.await();// 队列满了生产者等待enqueue(e);}finally{lock.unlock();}}总结对比ifwhile条件检查次数进入wait前检查一次每次从wait返回后都重新检查虚假唤醒直接执行后续逻辑可能出问题重新判断条件安全notifyAll()场景被错误唤醒的线程会越界操作条件不满足则继续等待结论不可行必须使用简单说使用while的目的是确保线程从wait()返回时等待条件确实已经满足这是并发编程中的标准实践也是《Java 并发编程的艺术》和 JDK 源码中推荐的写法。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

真实废弃物分类数据集实战:4,800张图从训练到部署 2026/9/28 22:22:11

真实废弃物分类数据集实战:4,800张图从训练到部署

简介:本资源为面向计算机视觉初学者与图像分类实践者的真实废弃物图像分类数据集,覆盖纸板、食品有机物、玻璃、金属、杂项垃圾、纸张、塑料、纺织品垃圾和植被共9个类别,适合用于分类网络训练、迁移学习验证及垃圾分类相关课程设计。数据已完…

阅读更多 →
Altium Designer晶振铺铜挖空设计原理与实操 2026/9/28 22:21:49

Altium Designer晶振铺铜挖空设计原理与实操

1. 这不是“填铜”而是“控铜”:晶振区域铺铜的本质矛盾与破局逻辑Altium Designer里画多边形铺铜,很多人以为只是把空白区域“填满”——这恰恰是导致晶振电路失效、EMI超标、起振失败的根源。我带过三届硬件新人,90%的人第一次做STM32H743Z…

阅读更多 →
Superpowers 实战:为 AI 编程助手注入技能包与四阶段工作流 2026/9/28 22:21:42

Superpowers 实战:为 AI 编程助手注入技能包与四阶段工作流

做开发这么多年,我越来越相信一件事:工具本身不产生价值,用工具的习惯才产生价值。superpowers 这个名字听起来像游戏外挂,实际上是一套围绕 AI 编程助手设计的技能增强方案。它不是要替代 Codex 这类智能体,而是给它们…

阅读更多 →
Superpowers技能包:让AI编程Agent输出质量更稳的实战指南 2026/9/28 22:21:35

Superpowers技能包:让AI编程Agent输出质量更稳的实战指南

superpowers 这个名字第一次看到时,我以为是某个效率玄学工具,直到在 Codex 工作流里真正连续用了一周,才确认它并不是包装出来的概念,而是真的能把 AI 编程 Agent 的产出质量往前推一截的东西。它不是脚手架,也不是&q…

阅读更多 →
基于PaddleOCR的车牌识别算法:从检测到识别的全流程实战与优化 2026/9/28 22:21:08

基于PaddleOCR的车牌识别算法:从检测到识别的全流程实战与优化

简介:本资源面向计算机视觉初学者与进阶开发者,提供一套基于PaddleOCR的车牌识别完整项目源码,帮助读者从零搭建可运行的车牌检测与识别系统,解决车牌定位、字符识别及模型部署等实际问题。压缩包共416个文件,约37MB&a…

阅读更多 →
Python深度学习人脸识别系统毕业设计:从CNN选型到答辩演示全链路 2026/9/28 22:21:08

Python深度学习人脸识别系统毕业设计:从CNN选型到答辩演示全链路

简介:这份资源面向高校学生与深度学习入门者,提供一套基于Python的人脸识别系统完整毕业设计实现,涵盖代码、模型与文档说明,可用于毕业设计、课程设计或期末大作业。项目采用深度学习方案,涉及FER2013、CK、JAFFE等公…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉