java线程通信:同步代码块中执行wait和notify出错的问题

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路 本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。 阅读详情

1,问题描述:

当使用同步代码块synchronized(Obj)代码块来解决生产者消费者问题时。出现了如下问题

2,下面是出错的完整代码:

代码中包含四个文件如下所示:

产品类:

生产者线程:

消费者线程:

测试类:

3,分析问题:

4,解决问题:

生产者和消费者线程都做如下改动,就可以了。

5,运行结果截图:


1,问题描述:

当使用同步代码块synchronized(Obj)代码块来解决生产者消费者问题时。出现了如下问题

2,下面是出错的完整代码:

代码中包含四个文件如下所示:

产品类:

package com.wyqxjw.test01;

/**
 * @Auther: yqwang
 * @Date: 2021/4/7
 * @Description: com.wyqxjw.test01
 * @version: 1.0
 */
//产品类(供消费者消费,生产者生产)
public class Product {
    private String brand;//品牌
    private String name;//产品名
    public boolean flag = false;//一个信号,当为false时,意味着仓库里没产品,消费者需要等待,生产者可以生产。否则相反

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Product(String brand, String name) {
        this.brand = brand;
        this.name = name;
    }

    public Product() {
    }
}

生产者线程:

package com.wyqxjw.test01;

/**
 * @Auther: yqwang
 * @Date: 2021/4/7
 * @Description: com.wyqxjw.test01
 * @version: 1.0
 */
public class ProducerThread extends Thread{
    Product p;
    public ProducerThread(Product p){
        this.p = p;
    }
    @Override
    public void run() {
        for (int i=0; i<20; i++) {
            synchronized (p) {
                if (p.flag){
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (i % 2 == 0) {
                    p.setBrand("费列罗");
                    p.setName("巧克力");
                } else {
                    p.setBrand("哈尔滨");
                    p.setName("啤酒");
                }
                System.out.println("我是生产者,我生产了" + p.getBrand() + "-----" + p.getName());
                p.flag = true;
                notify();
            }

        }
    }

}

消费者线程:

package com.wyqxjw.test01;

/**
 * @Auther: yqwang
 * @Date: 2021/4/7
 * @Description: com.wyqxjw.test01
 * @version: 1.0
 */
public class ConsumerThread extends Thread{
    Product p;
    public ConsumerThread(Product p){
        this.p = p;
    }
    @Override
    public void run() {
        for (int i=0; i<20; i++){
            synchronized (p){
                if (!p.flag){
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("我是消费者,我消费了"+p.getBrand()+"-------"+p.getName());
                p.flag = false;
                notify();
            }

        }
    }
}

测试类:

package com.wyqxjw.test01;

/**
 * @Auther: yqwang
 * @Date: 2021/4/7
 * @Description: com.wyqxjw.test01
 * @version: 1.0
 */
public class Test {
    public static void main(String[] args) {
        Product p = new Product();
        ProducerThread pt = new ProducerThread(p);
        ConsumerThread ct = new ConsumerThread(p);
        pt.start();
        ct.start();
    }
}

3,分析问题:

4,解决问题:

生产者和消费者线程都做如下改动,就可以了。

5,运行结果截图:

参考资料:https://blog.youkuaiyun.com/coding_1994/article/details/80634792(感谢这个文章的作者和翔哥,提供了改bug的思路,在交流中成长,在总结中稳固江山。)

告别密码明文传输:手把手带你用Python实现SRP-6协议(附完整代码) 本文详细介绍了如何使用Python实现SRP-6协议,确保密码安全传输和存储。通过零知识证明与密钥交换技术,SRP协议在不传输明文密码的情况下完成认证,适用于金融App等高安全需求场景。文章包含完整代码示例和实战技巧,帮助开发者规避常见安全陷阱。 阅读详情

相关推荐

MobileNet V3 图像分类

MobileNet V3

Henry的博客 1769

JAVA 多线程 IllegalMonitorStateException 异常原因及解决办法

  在同步控制方法或同步控制块里调用wait(),notify()和notifyAll()。如果在非同步控制方法里调用这些方法,程序能通过编译,但运行的时候,将得到IllegalMonitorStateException异常,并伴随着一些含糊的消息,比如"当前线程不是拥有者"。消息的意思是,调用wait(),notify()和notifyAll()的线程在调用这些方法前必须"拥有"对象的锁。当前的...

萧曳丶 799

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图)

本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。

weixin_29239279的博客 538

为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?以及为什么使用在while循环里

wait()在同步方法/代码块中调用原因:      wait()属于Object方法,调用之后会强制释放当前对象锁,所以在 调用某对象的wait()方法之前,当前线程必须先获得该对象的锁。因此,wait()方法在同步方法/代码块中调用。 notify()/notifyAll()在同步方法/代码块中调用原因:      调用wait()后,释放了对象锁,并将线程放入这个对象的等待队列(池),当执行notify()/notif

假人一个的博客 1247

STM32 CubeMX LwIP + freertOS 移植

生成代码,烧录即可ping通。这里要注意的是,要修改freertOS的任务栈大小,默认128,修改为1024,不修改就跑不起来。生产代码,下载进开发板。开发板网口与电脑网口通过网线直连,设置电脑本地网卡在同一网段。在以上无系统的cubeMX配置下继续添加freertOS。无系统LWIP协议栈设置,静态IP地址,关闭DHCP。先用裸机测试LAN8742A的网卡驱动。MCU型号:STM32F746NGH。下面进行freertOS系统移植。网卡型号:LAN8742A。系统时钟和时基定时器如下。

u011625775的博客 1375

Pika Labs vs Runway ML:零基础小白如何选择最适合自己的AI视频生成工具?

本文详细对比了Pika Labs和Runway ML两款AI视频生成工具,从操作界面、生成效果、隐藏成本、工作流适配性和未来兼容性五个维度进行分析。Pika Labs适合零基础用户快速生成社交媒体短内容,而Runway ML则更适合专业级视频制作。帮助用户根据自身需求选择最适合的AI视频生成工具。

wood5的博客 603

java用this- gt_Java并发:同步(this)=>和this.wait()和this.notify()

Qute开始:public synchronized void enqueue(T obj) {// do addition to internal list and then...this.notify();}public synchronized T dequeue() {while (this.size()==0) {this.wait();}return // something from...

weixin_39517289的博客 431

贪婪投影三角化算法

贪婪投影三角化算法是一种利用点云数据进行曲面重建的方法。其基本思想是通过迭代地连接点云中的邻近点来生成三角形,从而构建出整个表面。这种方法被称为“贪婪”,因为它在每一步仅考虑当前最优的策略,而不考虑全局的最优性。

twnkie的博客 1567

java的wait_java wait()方法用法详解

一、wait(), notify(), notifyAll()等方法介绍1.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)2.notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线...

weixin_29426299的博客 1万+

DeepSeek + 微信:手把手教你把 AI 接入个人微信,秒变“高情商”聊天助手(防封指南)

将 DeepSeek 接入微信,本质上是给你的微信装了一个**“最强外挂”**。它不仅能帮你回消息,还能帮你写周报、查资料、甚至陪聊解闷。工具是服务于人的,不要让 AI 完全替代了你的真情实感。毕竟,真正的高情商,是屏幕背后那个在乎对方的你。先申请一个小号,按照步骤跑通流程。然后试着调整 Prompt,训练一个属于你自己的“嘴替”吧!

BUG猿的博客 963

040、未来展望:MLIR与编译技术的演进方向

MLIR不是又一个编译框架,它更像是一套“元框架”——提供构建专用编译工具的能力。未来几年,我们会看到更多垂直领域(自动驾驶、射频信号处理、生物计算)出现基于MLIR的专用编译器,它们可能不会挂“MLIR”的名字,但内核都是这套可扩展的IR基础设施。不要等MLIR“成熟”再用,现在就该把它当成一把瑞士军刀,先挑刀口最锋利的那个功能(比如图优化、循环变换)用起来。编译技术的演进不再是学术界的独角戏,而是越来越贴近实际生产中的异构、动态、领域专用需求。

m0_50546716的博客 175

java中notify会报错,线程wait和notify报错java.lang.IllegalMonitorStateException

本质上就是:sleep是Thread类的方法,wait是Object类中定义的方法JavaDoc中说到:A thread becomes the owner of the object's monitor in one of three ways:1. By executing a synchronized instance method of that object.2. By executin...

weixin_39970689的博客 516

YOLOv8 智能交通违章检测 - 压线/越线行驶检测详解

本文提出了一种基于YOLOv8的智能交通违章检测方案,重点解决车辆压线/越线行驶的识别问题。系统采用多技术融合方案:YOLOv8检测车辆、ByteTrack跟踪轨迹、传统或深度学习方法识别车道线,并通过几何计算判断车辆是否违规跨越实线。文章详细介绍了技术难点(如车道线分类、透视变形处理)、判定流程、系统架构和核心代码实现,包括车道线检测、违章逻辑判断和可视化模块。同时指出了现有方案的局限性,建议通过引入逆透视变换和专用车道线分割模型来提升准确率。该纯视觉方案具有低成本、易部署的特点,适用于智能交通监控场景。

u010117029的博客 177

【java】线程间通信之wait和notify

本文转载自:Java 多线程(七) 线程间的通信——wait及notify方法 1. 线程间通信   一些场景下,需要多个线程之间协调通信,来共同完成一件任务。java中Object类中相关的方法有两个notify方法和三个wait方法:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html。因为wait和notify方法定...

XYZ 504

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

使用wait方法和notify方法用于线程间通信的正确姿势

wait/notifyAll

Vincent 6139

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

线程之间的通信—wait()、notify()、notifyAll()

wait()和notify()是进行线程间通讯的两个重要的方法。 1.wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”) 2.notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,...

qq_45036591的博客 1102

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java 线程通信,wait()、notify()与notifyAll()的使用方法及示例代码

目录 简介 示例代码 更多示例代码请看我的其他博客或GitHub。不定期更新,学习过程中用到就写到哪里,作为模板供以后使用和复习。 简介 wait方法和notify方法,并不是Thread线程上的方法,它们是Object上的方法。 因为所有的Object都可以被用来作为同步对象,所以准确的讲,wait和notify是同步对象上的方法。 wait()的意思是: 让占用了这个同步对象的线程,...

qq_42145816的博客 306

synchronized和wait()/notify()

方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。wait()/notify():调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则

ruixj的专栏 4031

线程间通信与变量修改感知:几种常用方法

在Java多线程编程中,线程间的通信和同步是确保数据一致性和程序稳定性的关键。当线程A修改了某个共享变量,线程B如何感知这一变化并据此执行相应的操作。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 5960

synchronized及wait,notify

方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。wait()/notify():调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则

程序人生,奋斗人生! 2370

Java 多线程编程之:notify 和 wait 用法

最近看帖子,发现一道面试题: 启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100 题目要求用 Java 的 wait + notify 机制来实现,重点考察对于多线程可见性的理解。 wait 和 notify 简介 wait 和 notify 均...

weixin_34100227的博客 225

线程状态模型与synchronized的wait与notify方法

1. 线程状态图 这是线程的7状态模型图,常见的7大状态之间的转换关系也在上面。多线程之间的通信主要用到4个方法,wait()、wait(long time)、notify()、notifyAll(),其他方法在多线程基础中都有介绍。 wait():作用是使当前线程从调用处中断并且释放锁转入等待队列,直到收到notify或者notifyAll的通知才能从等待队列转入锁池队列,没有收到停止会一直死等。 wait(long time):相比wait多了一个等待的时间time,如果经过ti..

好好学java 1042

如何在 Java 中正确使用 wait, notify 和 notifyAll

wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。 在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓 冲区中有

caomiao2006的专栏 666

wait, notify 和 notifyAll 使用

如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例 2015/08/04 | 分类: 基础技术 | 7 条评论 | 标签: NOTIFY, NOTIFYALL, WAIT 分享到: 本文由 ImportNew - 伯乐在线翻译组 翻译自 javarevisited。欢迎加入翻译小组。转载请见文末要求。

kuiyi3269的博客 300

JAVA多线程suspend()、resume()和wait()、notify()的区别

suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的 resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情 形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。但suspend(

Apache012的专栏 2807

java wait()怎么用_Java中wait()和notify()方法的使用

1.wait方法和notify方法这两个方法,包括notifyAll方法,都是Object类中的方法。在Java API中,wait方法的定义如下:public finalvoidwait()throws InterruptedExceptionCauses the current thread to wait until another thread invokes thenotify(...

weixin_39676348的博客 416
上一篇: 大并发服务器开发架构介绍
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值