# Java中AQS-ConditionObject的用法
## 一、AQS與ConditionObject概述
Java并發包中的`AbstractQueuedSynchronizer`(AQS)是構建鎖和同步器的基礎框架,而`ConditionObject`是AQS的內部類,用于實現條件等待/通知機制。它相當于傳統監視器模型的`wait/notify`的增強版,提供了更靈活、更可控的線程協作方式。
### 核心特點
- **多條件隊列**:單個AQS可關聯多個ConditionObject
- **精確喚醒**:支持喚醒指定條件的線程(signal())
- **可中斷等待**:提供可中斷/不可中斷的等待選項
- **超時控制**:支持納秒級超時設置
## 二、ConditionObject核心方法解析
### 1. 等待方法
```java
// 不可中斷等待
void await() throws InterruptedException;
// 可中斷等待
void awaitUninterruptibly();
// 帶超時的等待(納秒精度)
long awaitNanos(long nanosTimeout) throws InterruptedException;
boolean await(long time, TimeUnit unit) throws InterruptedException;
// 喚醒一個等待線程
void signal();
// 喚醒所有等待線程
void signalAll();
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await(); // 等待不滿條件
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal(); // 喚醒消費者
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await(); // 等待不空條件
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal(); // 喚醒生產者
return x;
} finally {
lock.unlock();
}
}
}
class AlternatingPrinter {
private final Lock lock = new ReentrantLock();
private final Condition conditionA = lock.newCondition();
private final Condition conditionB = lock.newCondition();
private boolean flag = true;
public void printA() {
lock.lock();
try {
while (!flag) {
conditionA.await();
}
System.out.println("A");
flag = false;
conditionB.signal();
} finally {
lock.unlock();
}
}
public void printB() {
lock.lock();
try {
while (flag) {
conditionB.await();
}
System.out.println("B");
flag = true;
conditionA.signal();
} finally {
lock.unlock();
}
}
}
graph TD
A[調用await] --> B[加入條件隊列]
B --> C[釋放鎖]
C --> D[進入阻塞狀態]
D -->|被signal| E[轉移到同步隊列]
E --> F[競爭鎖資源]
while (conditionNotMet) {
cond.await();
}
| 特性 | ConditionObject | Object監視器 |
|---|---|---|
| 多條件隊列 | 支持 | 不支持 |
| 等待/通知 | await/signal | wait/notify |
| 超時控制 | 納秒級 | 毫秒級 |
| 中斷響應 | 可配置 | 固定響應中斷 |
| 鎖要求 | 必須持有顯式鎖 | 必須持有對象監視器鎖 |
ConditionObject作為AQS的條件等待實現,提供了比傳統wait/notify更強大的線程協作能力。其核心價值在于: 1. 通過分離條件隊列實現更精細的線程控制 2. 支持中斷和超時等現代并發需求 3. 與Lock接口完美配合形成完整的并發工具鏈
正確理解和使用ConditionObject可以顯著提升復雜并發場景下的代碼可維護性和系統吞吐量。建議結合具體業務場景,合理設計條件謂詞和通知策略,以充分發揮其并發控制優勢。 “`
注:本文實際約1500字,可根據需要增減示例或原理分析部分調整字數。關鍵代碼示例已包含核心用法,原理部分可通過添加更多實現細節擴充。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。