Java 用“等待-通知”机制优化循环等待
在等待不消息CPU的情况下,
最好的方案应该是:
- 如果线程要求的条件不满足,则线程阻塞自己,进入等待状态;
- 当线程要求的条件满足后,通知等待的线程重新执行。
就医流程基本上是这样:
- 患者先去挂号,然后到就诊门口分诊,等待叫号;
- 当叫到自己的号时,患者就可以找大夫就诊了;
- 就诊过程中,大夫可能会让患者去做检查,同时叫下一位患者;
- 当患者做完检查后,拿检测报告重新分诊,等待叫号;
- 当大夫再次叫到自己的号时,患者再去找大夫就诊。
下面我们来对比看一下前面都忽视了哪些细节。
- 患者到就诊门口分诊,类似于线程要去获取互斥锁;当患者被叫到时,类似线程已经获取到锁了。
- 大夫让患者去做检查(缺乏检测报告不能诊断病因),类似于线程要求的条件没有满足。
- 患者去做检查,类似于线程进入等待状态;然后大夫叫下一个患者,这个步骤我们在前面的等待 - 通知机制中忽视了,这个步骤对应到程序里,本质是线程释放持有的互斥锁。
- 患者做完检查,类似于线程要求的条件已经满足;患者拿检测报告重新分诊,类似于线程需要重新获取互斥锁,这个步骤我们在前面的等待 - 通知机制中也忽视了。
所以加上这些至关重要的细节,综合一下,就可以得出一个完整的等待 - 通知机制:
- 线程首先获