线程A阻塞过程如下:
检查条件不满足
将自身添加到等待队列,并将当前状态设置为阻塞
再次检查条件
仍不满足,调度
释放资源
五个部分,线程能否真正阻塞取决于是否会进入第四部,且线程状态非RUNNING。
线程B可能在任何时刻进行如下动作
触发条件满足
唤醒所有等待条件满足的队列上的线程
分三种场景分析:
1
线程B在A第一次检查条件后使条件满足。
难道A第二次检查一定满足,不会调度。
2
线程B在A设置等待队列后将条件设置为满足,分析同上不会调度。
3
线程B在A第二次检查后设置条件。此时A一定会调度。但此时A已经加入到等待队列中,因此B在唤醒等待队列时一定会将A的状态改为RUNNING,则A一定会被唤醒。