首页 > 其他分享 >notify为什么会引发超时,notify和notifyAll的区别

notify为什么会引发超时,notify和notifyAll的区别

时间:2023-03-08 23:35:53浏览次数:37  
标签:锁池 notifyAll 线程 notify C1 超时 等待

notify为什么会引发超时,notify和notifyAll的区别

每个同步对象都有对应的monitor,首先了解下monitor的内部结构。

1.monitor结构

Snipaste_2023-03-08_23-01-07.jpg

  • Owner:指向拥有该同步对象的锁的线程,初始时为NULL
  • WaitSet(等待池):包含之前持有过锁,但是调用wait方法释放掉锁的线程
  • EntryList(锁池):包含当前正在竞争试图获取锁的线程

2.notify和notifyAll的区别

  • 线程调用了wait()方法,便会释放锁,并进入等待池(WaitSet)中,不会参与锁的竞争。
  • 调用notify()后,等待池(WaitSet)中的某个线程(只会有一个)会进入该对象的锁池(EntryList)中参与锁的竞争,若竞争成功,获得锁,竞争失败,继续留在锁池(EntryList)中等待下一次锁的竞争。
  • 调用notifyAll()后,等待池(WaitSet)中的所有线程都会进入该对象的锁池(EntryList)中参与锁的竞争。

3.notify造成超时的原因

以生产者消费者案例为例:

  1. 现在有三个线程,生产者P1, 消费者C1和C2.开始运行的时候,三个都在锁池中等待竞争,假设C1抢到锁了,C1执行时由于没有资源可以消费 调用wait()方法,释放锁并进入等待池。
  2. C2抢到了锁,开始消费,同理,C2也进入了等待池。现在锁池里面只剩下了P1。
  3. P1获得了锁,开始生产,生产完成后,P1开始调用notify()方法唤醒等待池中的C1或者C2,然后P1调用wait()方法释放锁,并进入了等待池。
  4. 假设唤醒的是C1,C1进入锁池并获得锁,消费后notify()方法唤醒了C2,C2进入锁池,C1进入等待池,现在锁池中只有C1。
  5. C1获得了锁,发现没有任何资源可以消费,wait()后释放了锁,进入了等待池,现在三个线程全都在等待池,锁池中没有任何线程。导致无限等待!

notifyAll()后,不存在只唤醒同类线程的情况,故也就不会出现上述情况。

引用

https://juejin.cn/post/6844903801363628045

标签:锁池,notifyAll,线程,notify,C1,超时,等待
From: https://www.cnblogs.com/214txdy/p/17196700.html

相关文章

  • 我又和redis超时杠上了
    我又和redis超时杠上了服务监控系列文章服务监控系列视频背景经过上次redis超时排查,并联系云服务商解决之后,redis超时的现象好了一阵子,但是最近又有超时现象报出,但与上......
  • [java]-超时自动处理
    实现方式1.数据库轮询(30)订单表(订单ID、状态、创建时间)物理、逻辑2.JDK队列DelayedQueue无界阻塞队列​poll()得到超时的元素,如果没有任何元素超时,......
  • Docker启动RabbitMQ访问15672连接超时解决方法
    docker成功启动rabbitmq后访问15672端口报连接超时原因:rabbitmq默认web界面管理插件是关闭的,需要通过命令开启解决办法:1、查看rabbit的容器id:dockerps2、进入......
  • 订单超时怎么处理?我们用这种方案
     背景在企业的商业活动中,订单是指交易双方的产品或服务交易意向。交易下单负责创建这个交易双方的产品或服务交易意向,有了这个意向后,买方可以付款,卖方可以发货。......
  • Linux系列---【设置ssh连接超时时间】
    设置ssh连接超时时间shell工具总是不断的超时,上个厕所就断开了,很不方便,这里根据自己习惯设置一下。echo"exportTMOUT=600">>/etc/profile&&source/etc/profile......
  • 延迟队列实现订单超时自动取消
    在上一篇Java实现订单未支付超时自动取消,使用Java自带的定时任务TimeTask实现订单超时取消,但是有小伙伴提出这种实现,会有以下几个问题:线上服务挂了,导致服务下所有的定......
  • 87.C# NotifyIcon 托盘控件
    87.C#NotifyIcon托盘控件原创2023-02-0104:51·数字双碳王亮摘要指定可在通知区域创建图标的组件。此类不能被继承。正文如下图,托盘是指程序图标显示在这......
  • 使用默认pypi源出现连接超时
    背景信息安装dataworkssdk时报错,原因是连接默认的pypi仓库超时pipinstallaliyun-python-sdk-dataworks-public==4.2.1报错信息Retrying(Retry(total=4,conne......
  • mq超时异常org.apache.rocketmq.client.exception.MQBrokerException: CODE: 2 DESC:
       mq生产环境正常生产和消费都挺稳定的,99.999%应该都没问题的,比较稳定。今天刚好碰到过一例因为写超时导致异常问题。   2023-02-2321:19:58.449TID:8b......
  • Seata Xa事务超时问题排查和解决
    现有服务列表在使用seata时总会超时通过skyWalking追踪发现在调用接口camunda/group/list时获取getConnection超时,在全局事务回滚后,sql又能正常执行问题原因和解决......