JAVA多线程番外篇 2、while和wait的配合使用

【SpringBoot 4.x 第2节】夯爆了,学习 Spring Boot 4.x 前,需要具备哪些 Java 基础? 🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。 阅读详情

理解了多线程,才能理解了现代分时操作系统,并进一步理解更多系统应用组件的底层原理。并发编程是低级程序员跨越到中高级程序员必过一关,是区分程序员水平的最常用的标准。在程序员求职过程中,多线程知识会被频繁问及考察,几乎所有的招聘要求里都会要求熟悉高并发编程。

1.wait需要配合while使用

在线程协调的场景中,常常会看到wait和while配合使用。

比如一个消费者,在判定队列是否为空,使用如下代码:

为什么需要使用到while呢?

public void synchronized consume() {
    while(队列==空) {
        wait();
    }
    消费();
    notifyAll();
}

2.机制原理

我们逐行分析代码,

  • 首先这是一个同步方法。synchronized意味着,方法在执行过程中会通过锁定this,实现互斥原子性操作。

  • 此时,如果队列==空,那么意味着消费者线程需要等待,那么就会执行wait()方法。

  • wait()方法执行后,就会释放锁,并将当前线程放进等待队列中。

2.1 为什么需要再次判定

  • 如果有两个生产者A和B,一个消费者C。当存储空间满了之后,生产者A和B都被wait,进入等待唤醒队列。当消费者C取走了一个数据后,如果调用了notifyAll(),则生产者线程A和B都将被唤醒,如果此时A和B中的wait不在while循环中而是在if中,**则A和B就不会再次判断是否符合执行条件,**都将直接执行wait()之后的程序,那么如果A放入了一个数据至存储空间,则此时存储空间已经满了;但是B还是会继续往存储空间里放数据,错误便产生了。
  • 如果有两个生产者A和B,一个消费者C。当存储空间满了之后,生产者A和B都被wait,进入等待唤醒队列。当消费者C取走了一个数据后,如果调用了notify(),则A和B中的一个将被唤醒,假设A被唤醒,则A向存储空间放入了一个数据,至此空间就满了。**A执行了notify()之后,如果唤醒了B,**那么B不会再次判断是否符合执行条件,将直接执行wait()之后的程序,这样就导致向已经满了数据存储区中再次放入数据。

2.2 为什么需要使用while呢,能不能使用if 判断呢?

  • 如果使用if
    • 当这个沉睡的线程被唤醒时,它醒来的地方就会直接进入下一个指令消费()。而不会在此判断。
  • 如果使用while
    • 当这个沉睡的线程被唤醒时,它醒来的地方还在循环内。于是会进行再一次判定,队列是否为空。
    • 如果队列为空就会继续wait()
    • 如果队列不为空才会执行消费()。

总结

记住,在多线程开发模式里需要注意安排wait和while的搭档,他们两个能够形成一个安全屏障,让不该醒来却醒来的线程再次睡去。

多线程系列在github上有一个开源项目,主要是本系列博客的实验代码。

https://github.com/forestnlp/concurrentlab

如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。

您的支持是对我最大的鼓励。

手把手教你学simulink(28.2)--四旋翼无人机景示例:基于自抗扰控制(ADRC)的无人机姿态稳定系统 通过上述代码实现,您可以逐步创建和搭建一个基于自抗扰控制的无人机姿态稳定系统。该系统能够实时估计和补偿外部扰动及模型不确定性,确保无人机姿态稳定。自抗扰控制具有较强的鲁棒性和适应性,能够在存在不确定性和扰动的情况下提供快速且精确的控制性能。Simulink提供了强大的建模和仿真工具,使得控制系统工程师能够快速构建复杂的控制算法,并将其应用于实际工程中。无人机动力学建模:建立无人机的六自由度(6-DOF)动力学模型,包括位置、速度、姿态角和角速度。自抗扰控制器设计。 阅读详情

相关推荐

阿里云大模型ACP认证模拟考试(二)

摘要:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 2077

WaitUntil和WaitWhile

 http://www.manew.com/thread-92253-1-1.html 目标 本篇博文的主要目标是告诉你在项目中如何使用WaitUntil和WaitWhile这两个API函数。 是否混淆了WaitUntil和WaitWhile? 不知道如何使用WaitUntil和WaitWhile? 如果你是上面这两种情况,那么现在就该我为你服务了。我假定在你阅读这篇博文前

haifeng619的专栏 1万+

CodeBlocks如何将英文环境改为中文

一、下载汉化包(链接如下) 链接:https://pan.baidu.com/s/166U9WGPbJXu2hyD7q9EiJQ 提取码:2333 二、选择路径 将汉化包中的文件(CodeBlocks.mo、zh_CN.mo、zh_CN.po)放到CodeBlocks安装路径下的​​​​​​CodeBlocks/share/CodeBlocks/locale/zh_CN文件夹中,路径中的文件夹没有就新建。 注:此处需严格按照要求来,切勿自定义文件夹名 三、内部调试 打开CodeBlocks,..

云隐雾匿的博客 2万+

Java多线程中wait()为什么要放在while循环中

首先来执行一段代码 public class ThreadWaitNotifyDemo { public static void main(String[] args) { AirConditioner airConditioner = new AirConditioner(); new Thread(() ->{ for (int i = 0; i < 10; i++) { airCond

weixin_54869604的博客 1446

PLS-PM with R 偏最小二乘路径建模 (R语言)

1. 引入 1.1. 安装plspm包 plspm 是一个用于执行偏最小二乘路径建模分析的 r 程序包。 在 CRAN 上可以免费下载: Http://cran.r-project.org/web/packages/plspm/index.html. 此后,通过以下代码在r中安装并加载该程序包即可。 install.packages("plspm") library("plspm") 2. 一些简单概念 2.1. 潜变量和观测变量 不少变量如满意度、成功指数是无法通过观测得到

Wowlittlemoon的博客 1万+

艾德克斯电子负载IT8510维修

2年前从朋友那收了这台艾德克斯电子负载,收来的时候上面的编码器就不好用,就是旋转的时候一会增加一会减小这种现象,不过其他功能都是正常的,自己也就将就用这。直到昨天,电子负载开机发现空载的时候电压不是0,开始有mV级的跳动,心想这个不正常。又测试了一下恒流功能,已经不能正常工作了。

mainbanp 4653

Java多线程wait()用while代码块的理解

多线程wait()判断条件这个地方的逻辑琢磨了挺久的,本意就是拿到锁之后如果条件不满足就等待,感觉用if和while似乎没啥区别 首先是生产者,单独一个线程,和消费者共用一个锁和一个队列,都通过构造方法传入 1.线程里直接死循环持续生产消息,消息体最好不一样,可以弄个随机数,我这里用了微妙时间戳,调用add()方法 2.需要添加一个条件,如果队列已经满了,就不能继续添加了,调用wait()方法等待被其它线程消费了之后唤醒 3.生产完消息后,调用notifyAll()方法,唤醒等待的所有线程,直到sy

luzhensmart的专栏 455

从时序精度到视觉盛宴:PY32F030驱动WS2812的工程艺术与避坑指南

本文深入探讨了基于PY32F030微控制器驱动WS2812智能LED的完整解决方案。通过精确的时序控制、硬件PWM结合DMA传输技术,实现了稳定可靠的驱动效果,并提供了电源管理、信号完整性和常见问题排查等实用避坑指南,帮助开发者轻松应对严格的纳秒级时序挑战。

wind6的博客 120

Unity中WaitUntil和WaitWhile的区别

环境说明:在协程中使用Yield return newWaitUntil(...)和Yield return new WaitWhile(...) 为了看的更清楚,这里不用lambda,咱不炫代码技巧,让不同层次的朋友能快速理解。 1、先说WaitUntil,代码如下: 当TestWait的返回值为true的时候,Start会一次性执行完。 当TestWait的返回值为false的时...

weixin_30298497的博客 1416

8 卡 GPU 服务器与 NVLink/NVSwitch 互联技术

NVLink 是一种点对点的高速互连技术,单条 NVLink 就是一条全双工双路信道,每条 NVLink 链路可以将 2 个 GPU 直连起来,并且每个 GPU 可以提供多条 NVLink 接口连接多个 GPU。另外,PCIe Switch 互联拓扑中的 GPU 之间可能存在 GPU0→Switch0→CPU0→CPU1→Switch1→GPU7 的通信链路,它的通信不可避免的存在一定的延迟,因而更适合用于对信号效率不敏感且追求性价比的使用场景,如:推理、云计算等领域。本文讨论的是单机 GPU 卡间互联。

烟云的计算 4262

QT实现警报应用程序

QT实现警报应用程序

希望我的博客,能帮上你解决学习中工作中所遇到的问题 2041

wait()方法为什么要放在while循环里面(虚假唤醒 过早唤醒)

java在使用内置锁实现消费者-生产者模式的时候,可以使用wait,notify,notifyAll三个方法,而且这三个方法都是基类Object的方法,要调用某一个对象的同步方法时,必须将其放在sycronized修饰的方法、对象、代码块里面,你必须先持有对象上的锁,才能在某个条件下,修改其等待状态,下面给出了使用同步方法的标准代码模式: synchronized (obj) { while (&lt;condition does not hold&gt;竞态条件)

及时雨的csdn 3739

全新YOLO26有效涨点改进专栏目录 | 本专栏持续更新500+篇内容 | 包含各种卷积、主干网络、各种注意力机制、检测头、损失函数、小目标检测改进、二次创新模块、独家创新等几百种创新点改进

🔥《2026年YOLO26改进专栏》🔥 🚀持续更新500+最前沿创新改进点(顶会顶刊论文/独家创新策略),涵盖主干网络、各种卷积、注意力机制、检测头等模块,助力科研论文发表与模型性能提升,支持检测/分割/分类任务。订阅即获完整可运行项目,提供专业QQ答疑群,适合科研发论文(SCI/CCF/核心)及工业应用(PCB/医学/遥感检测)。专栏价格将逐步上涨,早订更优惠! ⭐特色:非计算机专业友好、模块可自由组合、全网独家创新;📌适用:研究生大论文和小论文创新、小目标检测、多领域科研应用,满足不同研究需求。

Ai缝合怪、助力小伙伴高效发论文 5139

java多线程情况下,while和if的区别

在多线程情况下,如果一个线程进入了if语句块中,在if语句块中执行了wait方法,该线程处于等待(wait)状态,如果该线程被唤醒(notify),不管if的条件是否发生了变化,该线程会执行wait之后的代码,并且会跳出if语句块执行if语句块外面的代码   如果是while,被唤醒了之后,会继续执行wait方法之后的代码,代码块里面的代码执行完了会继续判断条件,如果为true,会继续执行wh...

u013958151的博客 3153

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

多线程--wait

目录 1.wait的使用 2.wait与sleep的比较 1.wait的使用 (1)使用wait和notify函数来实现线程间(一般为&gt;3的多线程)通信。 (2)永远在synchronized的函数或对象中使用wait、notify、notifyAll,不然虚拟机会生成IllegalMonitorStateException。 (3)永远在while循环里而不是if语句下使用wa...

weixin_42171262的博客 2639

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

你是如何使用 wait () 方法的?使用 if 还是 while

虚假唤醒是指线程在没有被显式唤醒(例如通过。

2401_87705025的博客 578

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java多线程 - wait、notify和notifyAll 详解

1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。 2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。 3、 由于 wait()、notify/notifyAll() 在syn...

qiang_zi_的专栏 441

Java多线程 - 如何正确的使用wait-notify方法?

文章目录1. sleep(long n) 和 wait(long n) 的区别2. 正确使用wait-notify方法 [while(条件)+wait]2.1 问题12.2 问题22.3 问题32.4 问题42.5 最终结果 问题: sleep() 和 wait() 有什么区别? 1. sleep(long n) 和 wait(long n) 的区别 (1) sleep 是 Thread 方法,而 wait 是 Object 的方法 ; (2) sleep 不需要强制和 synchronized 配合使用

你今天真好看呀 521

Java多线程学习之wait、notify/notifyAll 详解

点击“终码一生”,关注,置顶公众号 每日技术干货,第一时间送达! 1、wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。 2、wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。 3、 由于 wait()、notify/notifyAll() 在synchronized 代码块执行,说

终码一生 1870

java多线程中wait方法要在while中调用而非if中

开门见山直说: 在java多线程情况下,当线程被wait后,又通过notify方法唤醒时,在if情况下被唤醒,程序从哪里wait的就从哪里继续执行,在while的情况下被唤醒,程序依旧会从哪里wait的继续往下执行,但是,在执行之前会先对循环条件进行判断,满足条件继续wait,不满足条件继续执行。而if语句不会再对条件进行判断,直接继续执行。所以在多线程情况下,可能会有多个线程再对资源进行修改,当被wait的线程被唤醒时,有其他线程已经将资源进行修改过了,导致wait的条件发生变化(不再满...

bc_Reversing的博客 383

JAVA多线程基础篇 7、线程协作 wait()和notify()

wait和nofity是成对使用的,最好使用notifyAll(),这样可以唤起这条队列里所有的线程, 同时还需要注意的是,wait和while需要配对使用。

EndlessProcess的专栏 779

Java并发编程之wait、notify和join原理

文章目录1、wait、notify介绍2、API介绍3、sleep(long n) 和 wait(long n)的区别4、wait/notify的正确使用# 2、join源码3、park & unpack3.1、基本使用3.2、 park、 unpark 原理4、线程状态转换 1、wait、notify介绍 必须要获取到锁对象, 才能调用这些方法 当线程0获得到了锁, 成为Monitor的Owner, 但是此时它发现自己想要执行synchroized代码块的条件不满足; 此时它就调用obj.wa

从基础到源码解析的学习记录 1741

wait和notify原理

文章目录1.wait和notify1.1 小故事1.2 原理1.3 API介绍obj.wait() 和 obj.notify()sleep(long n)和 wait(long n) 的区别2.wait/notify的正确使用3.关于wait与notify和notifyAll方法的总结 1.wait和notify 1.1 小故事 1.2 原理 1.当前线程必须拥有此对象的monitor监视器(锁)。 2.当前线程调用wait()方法,线程就会释放此锁的所有权,并等待 3.直到另一个线程通过调用noti

张大安的博客 1993

你真的会正确使用wait和notify么?

synchronized(lock){//lock锁对象while(条件不成立){//条件不成立就一直等着}//符合条件执行业务代码....}//这边唤醒的线程要用notifyAll}上面就解决了虚假唤醒问题,以及能够让阻塞的同时,其他线程可以干活,在一定的时间内,可以高效的完成任务.以后在使用wait+notify的时候,就使用这么一套模板就行.已使用wait+notify就立马想到这套模板.参考黑马程序员视频01.001-为什么学习并发_哔哩哔哩_bilibili。

欢迎来到我的博客,在这里我会用我的方式来讲解知识,请大家多多关照 670

Java多线程中条件判断为啥要用while判断

Java多线程中生产消费模式总结 一、使用if判断造成的线程虚假唤醒问题 ​ 我们在使用线程时,进行条件判断时,往往会先考虑使用if进行判断,在线程进程进行等待时就会出现不确定的结果。先来看看两个线程下的操作。 /** 多线程编程模式 1、高聚低合前提下,线程操作资源类 2、判断/干活/通知 3、防止虚假唤醒 **/ class A { private int nums = 0; public synchronized void increment() throws Interru

weixin_44588532的博客 1023

android java wait_java中wait和notify的虚假唤醒问题

导读热词前言自己在此记录一下,方便日后复习。虚假唤醒的概念jdk官方文档解释:所以说在wait和notify一块使用时,如果使用if作为条件时,会有虚假唤醒的情况发生,所以必须使用while作为循环条件。下面来举例实验:首先,创建一个资源类:(在多线程中,一般都是资源类和线程操作解耦,不放在用同一个类中,只有在线程操作资源类时,才会创建资源类的对象)package com.test;/*** 资源...

weixin_42351363的博客 136
上一篇: JAVA多线程进阶篇 13、JUC并发容器
下一篇: JAVA多线程设计模式篇 1、什么是多线程设计模式
悟空学编程
博客等级 码龄12年 32粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悟空学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值