Condition等待通知

如果你知道经典的生产消费模式(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()方法会将等待队列的首节点(等待时间最长的节点)移动到同步队列中,图示如下:


节点从等待队列移动到同步队列(引自并发编程的艺术)

具体实现请查看源代码。

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容