00017.10wait()和notify()——生产者与消费者——线程通信解决的问题是什么2

本文探讨如何在多线程场景中,如多个厨师和服务员协作时,确保资源安全与公平调度。通过实例分析wait(), notify(), 和 notifyAll() 的使用,提出while循环实现的解决方案,并强调notifyAll() 在避免卡顿方面的最佳实践。
摘要由CSDN通过智能技术生成

系列文章目录

一、前言

我们把上一篇的完整代码拷贝下来,继续改造
上一篇我们是一个厨师一个服务员
如果是两个厨师或者多个厨师,两个服务员或者多个服务员怎么处理

二、具体操作

在这里插入图片描述
直接运行
在这里插入图片描述
我们明明加锁了,而且也加条件判断了,怎么可能还出现负数呢?
其实很好理解,假如翠花抢到了CPU,然后他执行完释放了,这时候别的服务员就有机可乘了
在这里插入图片描述
注意翠花收到厨师的通知之后一定是从上一次的 wait()后面开始运行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所以安全问题又暴露了

二、解决办法

1、如果
现在的问题就是怎么让它回去
一种是再次调用这个方法,另一种是改造成另一种语法
什么样的语法结果能够让代码回去呢?
没错,是while循环
在这里插入图片描述

那这样会不会一直while 出不来了呢?不会,因为条件不满足它就会往下走了,while的存在只是让它重新判断,
这样做的好处就是不管什么情况下每个线程进来都会重新判断
多线程不能完全按照单线程的思路去思考问题
在这里插入图片描述
我们再想办法让程序员暴露出一个问题,概率较低,这里不好演示了,意思就是超过1个生产者或者消费者的时候,建议使用
notifyAll(),一次唤醒所有的服务员,而不是一个
这样就不会卡顿,否则可能会小概率的卡顿

Object类中有:
(1)wait():必须由锁对象(线程的监视器对象)来调用。
(2)notify():必须由锁对象(线程的监视器对象)来调用。notify()作用就是唤醒一个正在等待的线程。唤醒的是同一个锁对象监视的等待线程。
(3)notifyAll():唤醒所有和我是同一个监视器对象的正在等待的线程

总结
1、notifyAll():唤醒所有和我是同一个监视器对象的正在等待的线程,一个生产者或者消费者的时候的时候也可以用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值