美文网首页
Condition等待通知

Condition等待通知

作者: high_m | 来源:发表于2017-09-10 17:30 被阅读0次

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


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

    具体实现请查看源代码。

    参考

    相关文章

      网友评论

          本文标题:Condition等待通知

          本文链接:https://www.haomeiwen.com/subject/ojftsxtx.html