如果你知道经典的生产消费模式(wait,notify实现),那么这篇文章你应该能够轻松地阅读理解。Condition接口也是为生产消费模式而生的,只不过它需要配合Lock接口使用。
使用示例
通过Lock
实例的newCondition()
方法获取Condition对象(监视器)。线程A获取锁后,调用condition.await()
方法会导致释放锁并在此等待。线程B获取锁后调用condition.signal()
方法会通知监视器,待线程B释放锁后,线程A可以重新加入到锁的竞争中,condition.await()
返回的必要条件是线程A再次成功获取到锁。
public class ConditionUseCase {
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void conditionWait() throws InterruptedException {
lock.lock();
try {
condition.await();
} finally {
lock.unlock();
}
}
public void conditionSignal() throws InterruptedException {
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
}
Condition实现分析
ConditionObjective是AbstractQueuedSynchronizer的内部类,因为Condition的实现需要获取到相关联的锁。每个Condition对象都包含着一个队列(等待队列,不同于同步队列),该队列是实现等待通知功能的关键。
调用await()方法时,会导致获取锁的线程放弃锁,并加入到等待队列的尾部,图示如下:
通知监视器的方法signal()方法会将等待队列的首节点(等待时间最长的节点)移动到同步队列中,图示如下:
具体实现请查看源代码。