每个对象都可以调用 Object 的 wait/notify 方法来实现等待/通知机制。而 Condition 接口也提供了类似的方法。Condition 接口一共提供了以下 7 个方法:

- await():线程等待直到被通知或者中断。类似于 Object.wait()。
- awaitUninterruptibly():线程等待直到被通知,即使在等待时被中断也不会返回。没有与之对应的 Object 方法。
- await(long time, TimeUnit unit):线程等待指定的时间,或被通知,或被中断。类似于 Object.wait(long timeout),但提供了更灵活的时间单位。
- awaitNanos(long nanosTimeout):线程等待指定的纳秒时间,或被通知,或被中断。没有与之对应的 Object 方法。
- awaitUntil(Date deadline):线程等待直到指定的截止日期,或被通知,或被中断。没有与之对应的 Object 方法。
- signal():唤醒一个等待的线程。类似于 Object.notify()。
- signalAll():唤醒所有等待的线程。类似于 Object.notifyAll()。
以下是 Object 类的主要方法,我们来做一下对比:

- wait():线程等待直到被通知或者中断。
- wait(long timeout):线程等待指定的时间,或被通知,或被中断。
- wait(long timeout, int nanos):线程等待指定的时间,或被通知,或被中断。
- notify():唤醒一个等待的线程。
- notifyAll():唤醒所有等待的线程。
Condition 源码分析
要想深入理解 Condition 的实现原理,就需要挖掘一下 Condition 的源码。创建一个 Condition 对象可以通过 lock.newCondition() 来创建,这个方法实际上会 new 一个 ConditionObject 的对象,ConditionObject 是 AQS 的一个内部类,我们就拿 ReentrantLock 来举例说明吧。
public class ReentrantLock implements Lock, java.io.Serializable {
abstract static class Sync extends AbstractQueuedSynchronizer {
final ConditionObject newCondition() {
return new ConditionObject();
}
}
Condition {
sync.newCondition();
}
}





