天天看點

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() 方法将會喚醒在等待隊列中的節點,移到同步隊列中