# Condition

## 一、简介

我们在使用Synchronized关键字的时候，可以使用对象监视器的wait/notify方法来实现等待通知。当我们使用Lock的时候，如果想要实现等待通知就需要使用Condition对象了。

## 二、与wait/notify的对比

| 对比项                        | 对象监视器的方法             | Condition                                       |
| -------------------------- | -------------------- | ----------------------------------------------- |
| 前置条件                       | 获取对象的锁               | 调用Lock.lock获取锁，调用Lock.newCondition获取Condition对象 |
| 调用方式                       | 直接调用，如：object.wait() | 直接调用，如：condition.await()                        |
| 等待队列个数                     | 一个                   | 多个                                              |
| 当前线程释放锁并进入等待状态             | 支持                   | 支持                                              |
| 当前线程释放锁并进入等待状态，在等待状态中不响应中断 | 不支持                  | 支持                                              |
| 当前线程释放锁并进入超时等待状态           | 支持                   | 支持                                              |
| 当前线程释放锁并进入等待状态到将来的某个时间     | 不支持                  | 支持                                              |
| 唤醒等待队列中的一个线程               | 支持                   | 支持                                              |
| 唤醒等待队列中的全部线程               | 支持                   | 支持                                              |
