Condition是对象监视器的替代品,拓展了监视器的语义
区别与联系
- 联系
- 都有一组类似的方法:
对象监视器: Object.wait()、Object.wait(long timeout)、Object.notify()、Object.notifyAll()。
Condition对象: Condition.await()、Condition.awaitNanos(long nanosTimeout)、Condition.signal()、Condition.signalAll()。
- 都需要和锁进行关联:
对象监视器: 需要进入synchronized语句块(进入对象监视器)才能调用对象监视器的方法。
Condition对象:需要和一个Lock绑定。
- 区别
- Condition拓展的语义方法:
awaitUninterruptibly():等待时忽略中断
awaitUntil(Date deadline) throws InterruptedException:等待到特定日期
- 使用方法:
**对象监视器: **进入synchronized语句块(进入对象监视器)后调用Object.wait()。
**Condition对象: **需要和一个Lock绑定,并显示的调用lock()获取锁,然后调用 Condition.await()。
- 等待队列数量:
**对象监视器: **1个。
**Condition对象: **多个。通过多次调用lock.newCondition()返回多个等待队列。
Condition接口
- 声明
- 等待方法
不管是发生中断还是超时都将继续竞争锁,而不是立即返回,只有再次获取锁时才能从等待方法返回(这一点和Object等待方法语义是一致的),根据中断状态抛出异常,
- 通知方法
AQS内部公共类ConditionObject对Condition接口的实现
Condition接口使用示例
官方文档里举了一个和ArrayBlockingQueue的功能相似的有界塞队列例子,接下来分析一下
-
定义
定义了两个Condition对象,notFull非满等待对象,notEmpty非空等待对象。
-
put 方法
-
take方法