②. 虚假唤醒问题分析
- ①. 初始状态
②. 厨师A得到操作权,发现面的数量为0,可以做面,面的份数+1,然后唤醒所有线程;
③. 厨师B得到操作权,发现面的数量为1,不可以做面,执行wait操作;
④. 厨师A得到操作权,发现面的数量为1,不可以做面,执行wait操作;
⑤. 食客甲得到操作权,发现面的数量为1,可以吃面,吃完面后面的数量-1,并唤醒所有线程;
⑥. 此时厨师A得到操作权了,因为是从刚才阻塞的地方继续运行,就不用再判断面的数量是否为0了,所以直接面的数量+1,并唤醒其他线程
⑦. 此时厨师B得到操作权了,因为是从刚才阻塞的地方继续运行,就不用再判断面的数量是否为0了,所以直接面的数量+1,并唤醒其他线程
⑧. 这便是虚假唤醒,还有其他的情况,读者可以尝试画画图分析分析