美文网首页
Condition接口详解

Condition接口详解

作者: zhanglbjames | 来源:发表于2017-05-28 16:34 被阅读0次

    Condition是对象监视器的替代品,拓展了监视器的语义

    区别与联系

    • 联系
    1. 都有一组类似的方法:

    对象监视器: Object.wait()、Object.wait(long timeout)、Object.notify()、Object.notifyAll()。
    Condition对象: Condition.await()、Condition.awaitNanos(long nanosTimeout)、Condition.signal()、Condition.signalAll()。

    1. 都需要和锁进行关联:

    对象监视器: 需要进入synchronized语句块(进入对象监视器)才能调用对象监视器的方法。
    Condition对象:需要和一个Lock绑定。

    • 区别
    1. Condition拓展的语义方法:

    awaitUninterruptibly():等待时忽略中断
    awaitUntil(Date deadline) throws InterruptedException:等待到特定日期

    1. 使用方法:

    **对象监视器: **进入synchronized语句块(进入对象监视器)后调用Object.wait()。
    **Condition对象: **需要和一个Lock绑定,并显示的调用lock()获取锁,然后调用 Condition.await()。

    1. 等待队列数量:

    **对象监视器: **1个。
    **Condition对象: **多个。通过多次调用lock.newCondition()返回多个等待队列。

    Condition接口

    1. 声明
    1. 等待方法
    不管是发生中断还是超时都将继续竞争锁,而不是立即返回,只有再次获取锁时才能从等待方法返回(这一点和Object等待方法语义是一致的),根据中断状态抛出异常,
    1. 通知方法

    AQS内部公共类ConditionObject对Condition接口的实现

    AQS的ConditionObject源码详解

    Condition接口使用示例

    官方文档里举了一个和ArrayBlockingQueue的功能相似的有界塞队列例子,接下来分析一下

    1. 定义



      定义了两个Condition对象,notFull非满等待对象,notEmpty非空等待对象。

    2. put 方法


    3. take方法


    相关文章

      网友评论

          本文标题:Condition接口详解

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