Java 用“等待-通知”机制优化循环等待

本文探讨了如何使用Java的`synchronized`关键字配合`wait()`、`notify()`、`notifyAll()`实现等待-通知机制。通过医生诊疗过程的比喻,详细解释了线程在条件不满足时进入等待状态,条件满足后通知其他线程的过程。建议在大多数情况下使用`notifyAll()`以避免某些线程无法被正确唤醒的风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 用“等待-通知”机制优化循环等待

在等待不消息CPU的情况下,

最好的方案应该是:

  • 如果线程要求的条件不满足,则线程阻塞自己,进入等待状态;
  • 当线程要求的条件满足后,通知等待的线程重新执行。

就医流程基本上是这样:

  1. 患者先去挂号,然后到就诊门口分诊,等待叫号;
  2. 当叫到自己的号时,患者就可以找大夫就诊了;
  3. 就诊过程中,大夫可能会让患者去做检查,同时叫下一位患者;
  4. 当患者做完检查后,拿检测报告重新分诊,等待叫号;
  5. 当大夫再次叫到自己的号时,患者再去找大夫就诊。

下面我们来对比看一下前面都忽视了哪些细节。

  1. 患者到就诊门口分诊,类似于线程要去获取互斥锁;当患者被叫到时,类似线程已经获取到锁了。
  2. 大夫让患者去做检查(缺乏检测报告不能诊断病因),类似于线程要求的条件没有满足。
  3. 患者去做检查,类似于线程进入等待状态;然后大夫叫下一个患者,这个步骤我们在前面的等待 - 通知机制中忽视了,这个步骤对应到程序里,本质是线程释放持有的互斥锁。
  4. 患者做完检查,类似于线程要求的条件已经满足;患者拿检测报告重新分诊,类似于线程需要重新获取互斥锁,这个步骤我们在前面的等待 - 通知机制中也忽视了。

所以加上这些至关重要的细节,综合一下,就可以得出一个完整的等待 - 通知机制:

  • 线程首先获取互斥锁,当线程要求的条件不满足时,释放互斥锁,进入等待状态;
  • 当要求的条件满足时,通知等待的线程,重新获取互斥锁。

用 synchronized 实现等待 - 通知机制

在 Java 语言里,等待 - 通知机制可以有多种实现方式,比如 Java 语言内置的 synchronized 配合 wait()、notify()、not

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值