天天看点

Condition实现等待、唤醒

Condition 接口是 JDK 1.5 开始提供的,用来实现线程间的等待与唤醒

Condition 的对象可以通过 Lock 对象的 newCondition() 方法创建

Condition 对象方法的调用必须在 Lock 对象的 lock() 和 unlock() 之间,否则会抛出异常 java.lang.IllegalMonitorStateException

Condition 的 await()、signal()、signalAll() 方法与 Object 的 wait()、notify()、notifyAll() 方法功能类似

Condition 接口的方法包括

使用示例:

Condition 的实现

Condition 接口的唯一实现类是同步器 AQS 的内部类 ConditionObject

每个 Condition 对象都包含着一个 FIFO 队列,拥有首节点(firstWaiter)和尾节点(lastWaiter)

队列中的每个节点都包含了一个在 Condition 对象上等待的线程引用

await() 方法相当于同步队列的首节点(已获取锁)移动到 Condition 的等待队列中

signal() 方法将会唤醒在等待队列中的节点,移到同步队列中