Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到Condition关联的锁。
Condition对象由Lock对象(调用Lock的newCondition()方法)创建出来的,换句话说,Condition是依赖Lock对象的。
首先跟一下Condition的await方法:
await
需要注意的是:调用await方法的线程肯定是持有锁的线程,即同步队列的头节点。
public final void await() throws InterruptedException {
// 如果当前线程被中断,抛出中断异常
if (Thread.interrupted())
throw new InterruptedException();
// 将当前线程添加到Condition条件队列
Node node = addConditionWaiter();
// 当前线程释放掉持有的锁,并将锁之前持有的状态值保存下来
int savedState = fullyRelease(node);
int interruptMode = 0;
while (!isOnSyncQueue(node)) {
// 若当前线程不在同步队列中,则挂起该线程
// 被唤醒的时机有2个:
// 1. 当前线程被中断;
// 2. 当前线程被signal
LockSuppor