🧩 一、CyclicBarrier 线程流转图(基于 AQS + ReentrantLock + Condition)
📌 前提说明
- 使用了
ReentrantLock
和Condition trip
; - 所有线程在调用
await()
时:- 获取锁 → 修改状态 → 判断是否释放锁并等待;
- 最后一个线程执行屏障动作并唤醒所有线程;
- 所有线程依次从等待中恢复并退出。
🖼️ 线程流转图(文字版)
[线程1] ──┐
│
[线程2] ─┼─> CyclicBarrier.await() → dowait()
│
[线程3] ─┘
│
├─ lock.lock() → 进入临界区
│
├─ --count → index = 当前线程编号(0 ~ N-1)
│
├─ index == 0?
│ ├─ 是:执行 barrierCommand.run() → nextGeneration() → trip.signalAll()
│ └─ 否:trip.await() → 自动释放锁 → 线程挂起等待被唤醒
│
└─ lock.unlock()
↑
│ 唤醒流程(由最后一个线程触发)
↓
trip.signalAll() → 所有等待线程从 await() 返回 → 重新获取锁 → 继续执行后续逻辑
🔗 二、AQS(AbstractQueuedSynchronizer) 底层原理详解
AQS
是 Java 并发包的核心组件之一,是 ReentrantLock
、CountDownLatch
、Semaphore
、CyclicBarrier
等同步工具的底层实现基础。
它本质上是一个抽象队列式同步器,通过一个 int state
表示同步状态,并使用 FIFO 队列管理等待获取同步状态的线程。
🧱 核心结构
abstract class AbstractQueuedSynchronizer {
private volatile int state; // 同步状态(如计数器、锁