生产者消费者模式中条件判断是使用while而不是if

二维电磁仿真中能量源边界设置的物理本质与工程实践 电磁仿真中的‘能量源’并非简单输入场值,而是满足麦克斯韦方程组约束、实现功率守恒与波前自洽的物理建模过程。其核心原理在于电场与磁场的耦合驱动、Poynting矢量的数值积分一致性,以及二维降维带来的模式截断与色散修正。技术价值体现在提升S参数精度、抑制非物理振荡、支撑光子晶体与超构表面等前沿设计。典型应用场景涵盖平面波入射、波导激励、周期性结构斜入射及时域脉冲仿真。本文聚焦二维电磁仿真中‘能量源’与‘边界条件’两大热词,系统拆解从物理建模到软件配置的全链路逻辑。 阅读详情

永远在循环(loop)里调用 wait 和 notify,不是在 If 语句

现在你知道wait应该永远在被synchronized的背景下和那个被多线程共享的对象上调用,下一个一定要记住的问题就是,你应该永远在while循环,而不是if语句中调用wait。因为线程是在某些条件下等待的——在我们的例子里,即“如果缓冲区队列是满的话,那么生产者线程应该等待”,你可能直觉就会写一个if语句。但if语句存在一些微妙的小问题,导致即使条件没被满足,你的线程你也有可能被错误地唤醒。所以如果你不在线程被唤醒后再次使用while循环检查唤醒条件是否被满足,你的程序就有可能会出错——例如在缓冲区为满的时候生产者继续生成数据,或者缓冲区为空的时候消费者开始小号数据。所以记住,永远在while循环而不是if语句中使用wait!我会推荐阅读《Effective Java》,这是关于如何正确使用wait和notify的最好的参考资料。

有的这样说:(http://www.tuicool.com/articles/a6ram23)

因为在多核处理器环境中, Signal 唤醒操作可能会激活多于一个线程(阻塞在条件变量上的线程),使得多个调用等待的线程返回。所以用while循环对condition多次判断,可以避免这种假唤醒。


基于以上认知,下面这个是使用wait和notify函数的规范代码模板:

1
2
3
4
5
6
7
8
// The standard idiom for calling the wait method in Java
synchronized (sharedObject) {
     while (condition) {
     sharedObject.wait();
         // (Releases lock, and reacquires on wakeup)
     }
     // do action based upon condition e.g. take or put into queue
}

就像我之前说的一样,在while循环里使用wait的目的,是在线程被唤醒的前后都持续检查条件是否被满足。如果条件并未改变,wait被调用之前notify的唤醒通知就来了,那么这个线程并不能保证被唤醒,有可能会导致死锁问题。

注意:

1 永远在synchronized的方法或对象里使用wait、notify和notifyAll,不然Java虚拟机会生成 IllegalMonitorStateException。

2 永远在while循环里而不是if语句下使用wait。这样,循环会在线程睡眠前后都检查wait的条件,并在条件实际上并未改变的情况下处理唤醒通知。

3 永远在多线程间共享的对象(在生产者消费者模型里即缓冲区队列)上使用wait。


转自:http://www.importnew.com/16453.html

家人们,谁懂啊,dify又报错了:[models] Bad Request Error, 500 Server Error:Internal Server Error for url: http:// 本来今天下班,坐在地铁上,一身劳累。一起上班的小兄弟儿,突然甩来一张截图:老大!dify又报错了。没办法,一到家就打开电脑,开始排查。 阅读详情

相关推荐

【嵌入式原理系列-第七篇】ld脚本实战:从零构建MCU内存布局

本文是一篇针对嵌入式开发者的实战指南,详细讲解了如何从零开始为MCU编写ld链接器脚本以构建自定义内存布局。文章以STM32F103C8T6为例,深入剖析了MEMORY和SECTIONS指令的用法,并提供了OTA分区、非易失数据存储等高级定制案例,帮助开发者解决实际工程中的Flash与RAM管理难题,实现对程序运行的深度掌控。

weixin_29271263的博客 249

一篇给你分析懂生产者与消费者问题为什么使用while不使用if(JUC)

JAVA代码示例 package com.juc.producerandconsumer; public class Syn1 { public static void main(String[] args) { Data data = new Data(); new Thread(() -> { for (int i = 0; i < 5; i++) { data.producer();

qq_45875887的博客 660

告别命令行恐惧!用nTopology可视化工具5分钟搞定三维Voronoi泡沫建模

本文介绍如何利用nTopology可视化工具快速生成三维Voronoi泡沫结构,无需编程即可完成复杂建模。Voronoi结构在轻量化设计、能量吸收和生物医学等领域具有重要应用,传统命令行方法门槛较高。通过nTopology的四步流程,用户可在5分钟内创建仿真就绪模型,大幅提升设计效率。

weixin_30764771的博客 426

生产者消费者循环条件判断用if还是while的问题

//生产者 public class p { private String lock; public p(String lock) { this.lock = lock; } public void setValue() { try { // 生产者 synchronized (lock) { System.out.println(Thread.curre...

tomorrow_shoe的博客 1383

【点云数据集】整理汇总(自用,更新ing)

涵盖了各种不同的城市场景:教堂、街道、铁路轨道、广场、村庄、足球场、城堡等等。邮件地址:dmich-request@graphics.stanford.edu,内容需包含:1. 您的姓名、头衔或职位,以及所在机构或隶属关系;license比较难获取,目前可获取的人员:(1)目前隶属于大学、工业研究实验室或其他主要机构的已发表过研究成果的研究人员;普林斯顿 ModelNet 项目的目标是为计算机视觉、计算机图形学、机器人技术和认知科学领域的研究人员提供全面、干净的物体 3D CAD 模型集合。

weixin_44392103的博客 797

手把手教你用CV5200模块搭建无人机高清图传系统(含实测数据)

本文提供了一份基于CV5200模块搭建远距离无人机高清图传系统的完整实战指南。文章详细解析了系统架构、硬件连接、软件配置与优化,并分享了实地飞行测试数据。核心在于利用CV5200的LR-WiFi私有协议,在视距下实现数公里级的稳定高清视频传输,为DIY爱好者和行业应用提供了高性价比的解决方案。

day7的博客 720

java个人学习笔记19(多生产者多消费者+循环判断标记+notifyAll()+Lock+Condition)

1.多生产者多消费者

...... 700

K-means算法代码实现(python)

K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ...

江南小帅瓜的博客 1万+

生产者消费者模式为什么不用if语句而用while循环

一、生产者消费者模式(只有两个线程一个是生产者线程一个是消费者线程) 重点!!!!!!!看这篇博客的时候首先要描述一下wait()方法的等待机制,当当先线程被wait之后会释放锁,当这个线程被唤醒的时候会继续从wait方法后面的代码继续执行。这个点也是这篇文章的点睛之笔,重中之重。也是为什么不用if用while的原因。 小声bb:我也是翻阅好多文章才知道线程阻塞,被唤醒之后竟然会接着执行线程wait方法后面的代码。我原来竟然一直傻逼的认为这个线程被阻塞之后会重新执行。菜鸟就是我我就是彩笔。 首先看一

qq_45702658的博客 923

MFC属性网格控件(CMFCPropertyGridCtrl)完全指南:构建专业属性编辑界面

本文详细介绍了MFC中的CMFCPropertyGridCtrl控件的使用方法。主要内容包括:控件基础用法(初始化、添加属性、事件处理)、高级设置(自定义外观、创建属性类型、动态更新)、派生类实现(自定义绘制、搜索过滤功能)、界面集成技巧(对话框布局、属性编辑器)以及实际应用示例。文章重点讲解了如何通过继承和自定义实现复杂功能,并提供了性能优化、多语言支持等最佳实践方案。该控件适用于需要大量参数配置的应用程序,能够创建类似Visual Studio属性窗口的专业界面。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 154

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

随着VS2022的发布,使用VS2022进行UG NX二次开发的人员也会越来越多,但是由于VS2022和以前的VS版本采用代码结构不同,而UG NX的二次开发编程模板还没有适应于VS2022的模板配置,所以不能正常的创建一个完整的工程。本文采用曲线救国的方式来实现VS2022下的UG NX二次开发。如果有读者能很好的解决模板配置,不吝赐教。

GimiGimmy 4274

生产者消费者模式中,等待条件判断 if 和 while 的区别

说明: 有三个生产者,三个消费者(各三个线程代表)。当产品数为0时开始生产产品,生产一个后通知消费者消耗产品,之后又生产。所以一直在0和1中徘徊,正确输出为1和0交替出现/ 一.if 控制等待条件,代码和结果如下 执行代码:Test package com.hz.wjsc.mservice.syntheticwarfare.test.thread.produce; public class Test { public static void main(String[] args) {

hqq_123的博客 919

华为面试手撕真题【判断是ipv4还是ipv6地址】

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。

MISAYAONE的博客 1万+

(四)生产者消费者模式

(一)生产者消费者模式原理: 在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图: (二)代码实现 生产者是一堆线程,消费者是另一堆线程,内存缓冲区可以使用List数组队列,数据类型只需要定义一个简单的类就好。最关键就是内存缓冲区为空的时候消费者必须等待,而内存缓冲区满的时候,生产者必须等待。其他时候可以是个动态平衡:   首先设置Market类: 其中变量有:Max(仓库最大值),List(用于存放数据) 方法有

roothahh的博客 9788

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ssm框架搭建

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

为什么生产者消费者中模式中要用while作临界判断?

关于生产者模式,想必大家也非常了解了,其中java实现的一个简易模型:生产者在一个固定容量的容器中加入元素,通知消费者消费,消费者消费后通知生产者生产 ​ 当生产的时候需要判断容器中是否已经满,为什么这个判断需要用while而不能用if呢,例如下面代码中第7行 public class MyContainer1<T> { final private LinkedList<T&g...

qq_37430539的博客 1937

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

生产者消费者模式中判断条件使用while的原因

虚假唤醒不是代码写错导致的,而是操作系统和 JVM 底层实现的 “正常小漏洞”—— 为了效率或简化设计,它们偶尔会 “多唤醒几个线程”,或者 “误唤醒线程”,本质是 “底层为了方便,牺牲了一点‘精确性’”。代码分析:但生产者消费者模式就是只有一个生产者和一个消费者。多个生产者多个消费者模式下,即使不出现虚假唤醒依然会有问题,因为唤醒的线程并不确定,即使全部唤醒,依然会有多个现成竞争的情况,而竞争的结果并不确定。由于存在虚假唤醒的问题,如果使用 if 在消费者没有消费完成的情况下即唤醒生产者就会出问题。

骄马之死的博客 302

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

生产者消费者_线程之生产者消费者模式

生产者消费者模式前几篇复习了下《线程的创建方式》、《线程的状态》、《Thread 的源码解析》、《wait、notify/notifyAll 源码解析》这几篇文章。这篇是第五篇生产者消费者模式在我们日常工作中用得非常多,比如:在模块解耦、消息队列、分布式场景中都很常见。这个模式里有三个角色,他们之间的关系是如下图这样的:图源:Java 并发编程 - 徐隆曦生产者线程:生产消息、数据消费者...

weixin_39630999的博客 131

逐步详细分析Java生产者-消费者问题,为什么使用 while 而不用 if ?

内容 1、存钱取钱(逐步分析生产者消费者问题) 2、使用 wait-notifyAll 实现生产者-消费者 3、使用 LinkedBlockingQueue 实现生产者-消费者 存钱-取钱 1、一个人存钱,一个人取钱:在卡中没钱的时候存钱,有钱的时候取钱,交替执行 flag为true时:只能取钱,存钱会被阻塞 flag为false时:只能存钱,取钱会被阻塞 public class BankCard { private double money; // true:只能取.

她的坏机器人 878

java多线程wait,notify使用时,不能用if的原因,以及为什么要用while

简介: 今天看面试题时,看到wait的使用里面有一句话是wait,notify要用while,而不能用if。想了半天不知道为什么,看到大佬说在生产者消费者模式下会出错。于是我测试了如下 用if举例 写一个工厂类,有生产和消费方法,以及生产的产品数组 public class Factory { //存放生产的数组 public char[] data = new char[5]; ...

qq_42034205的博客 1351

生产者消费者模式,观察者模式,工作者模式小结

1.生产者消费者模式 设计要点是 tray 生产者,消费者都要将对应的托盘对应为实例域 托盘的核心是一个DataQueue,但是tray并不直接将DataQueue的add和remove方法暴露给生产者消费者,而是 通过get()和put()方法。 get()和put()方法内部通过synchronized保护;内部通过while- wait - notify机制实现高效的轮流占有tr...

qq_43714612的博客 1773

生产者和消费者模式出现的虚假唤醒

生产者和消费者模式 if 共享数据 int num = 0; 生产者 public synchronized void pro() throws InterruptedException { if(num!=0){ this.wait(); //等待 } num++; notify(); //唤醒其他线程 消费者 public synchronized void cons() throws InterruptedException { if(num==0){ this.wait(); //

HolyLordHanChaun的博客 360

Java 生产者消费者synchronized 中为什么不能是if而要是while

实现示例 仓库Storage.java import java.util.LinkedList; /* 仓库 */ public class Storage { /* 仓库容量 */ private final int MAX_SIZE = 10; /* 仓库载体 */ private LinkedList<Object> list = new LinkedList<>(); public void produce(){

yygr的博客 534

传统线程生产者-消费者模式

传统线程生产者-消费者模式 大厂面试题: 我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案? 公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。 CountDownLatch、CyclicBarrier、Semaphore使用过吗? 阻塞队列知道吗? 线程池用过吗?ThreadPoolExecutor谈谈你的理解? 线程池用过...

泷泷养的乔小胖 379

生产者消费者模式(wait/notify)

一生产者和一消费者 MyTack类 public class MyTack { private List list =new ArrayList(); private Object lock; public MyTack(Object lock) { this.lock = lock; } public void push() { try { synchronized (lock) { if (list.size() == 1) { .

相信明天的博客 397

阻塞队列应用之生产者消费者模式

一、传统版 package com.lxk.lock; public class OldSync { public static void main(String[] args) { final Object object = new Object(); Thread t1 = new Thread() { public void run() { synchron...

lixinkuan的博客 901
上一篇: 算法:n&amp;(n-1)的总结
下一篇: Spring IOC AOP归纳总结
Mike_CSU
博客等级 码龄10年 6粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值