Condition接口详解

2017-05-28  本文已影响0人  zhanglbjames

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方法


上一篇 下一篇

猜你喜欢

热点阅读