AQS 在 Java 并发里通常指 AbstractQueuedSynchronizer抽象队列同步器。它是 JUCjava.util.concurrent里很多锁和同步工具的底层框架。ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock等都基于它实现。一、一句话理解AQS 用「一个状态变量 一个等待队列」管理线程抢资源、排队、唤醒的通用模板。你可以把它想成银行叫号系统state → 当前还有几个窗口/名额比如锁是否被占用CLH 队列 → 没抢到的人排队park/unpark → 叫到号唤醒你二、核心组成1.state状态一个volatile int表示同步状态含义由子类定义工具state 含义ReentrantLock0未锁0被锁可重入次数Semaphore剩余许可数CountDownLatch还剩几个线程没完成ReentrantReadWriteLock高 16 位读锁数低 16 位写锁数2. CLH 双向队列抢不到的线程会封装成 Node 放进 FIFO 队列里等待避免大量线程空转忙等。3. 模板方法子类只需实现两个方法// 尝试获取资源抢锁/抢许可 protected boolean tryAcquire(int arg) // 尝试释放资源放锁/还许可 protected boolean tryRelease(int arg)AQS 负责通用的排队、阻塞、唤醒逻辑。三、工作流程以独占锁为例获取锁简化理解public final void acquire(int arg) { // 1. 先试着抢 if (!tryAcquire(arg)) { // 2. 抢不到就入队 // 3. 自旋检查前驱是否是队头 // 4. 还不行就 park 挂起 } }释放锁public final boolean release(int arg) { if (tryRelease(arg)) { // 唤醒队列里下一个等待线程 unparkSuccessor(head); return true; } return false; }四、两种模式模式说明典型实现独占模式Exclusive同一时刻只有一个线程能拿到ReentrantLock、ReentrantReadWriteLock写锁共享模式Shared多个线程可同时拿到Semaphore、CountDownLatch、读写锁读锁五、和synchronized的区别synchronized基于 AQS 的锁如ReentrantLock实现JVM 内置监视器锁Java 代码实现灵活性自动加锁解锁可tryLock、可中断、可超时、可公平队列依赖 JVM 实现明确的 CLH 队列条件变量只有一个wait/notify可有多个ConditionReentrantLock比synchronized功能多就是因为 AQS 提供了可扩展的模板。六、代码里长什么样ReentrantLock内部有个继承 AQS 的同步器// 简化示意帮助理解 class Sync extends AbstractQueuedSynchronizer { protected boolean tryAcquire(int acquires) { final Thread current Thread.currentThread(); int c getState(); if (c 0) { // 没人占锁CAS 抢 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current getExclusiveOwnerThread()) { // 重入同一线程再加锁 setState(c acquires); return true; } return false; } protected boolean tryRelease(int releases) { // 释放锁state 减到 0 时真正放开 ... } }业务代码只管lock()/unlock()排队和唤醒由 AQS 统一处理。七、为什么重要1. 面试常考AQS 是什么ReentrantLock和synchronized区别公平锁 / 非公平锁怎么实现2. 理解并发工具的原理知道 AQS 后Semaphore、CountDownLatch就不再是「黑盒 API」。3. 和项目的关系场景可能用到接口限流Semaphore等待多个任务完成CountDownLatch需要可中断/超时加锁ReentrantLock线程池底层也依赖 AQS 协调你们前面聊的数据库锁、分布式锁、事务解决的是数据层并发AQS 解决的是单机 JVM 内线程同步层次不同但都服务于「多线程不打架」。八、常见考点速记AQS 三件套state → 同步状态CLH 队列 → 等待线程排队CAS park → 抢资源 / 阻塞 / 唤醒子类实现tryAcquire → 怎么抢tryRelease → 怎么放基于 AQS 的工具ReentrantLockReentrantReadWriteLockSemaphoreCountDownLatchCyclicBarrier内部也用 ReentrantLock Condition九、一句话总结AQS 是 Java 并发包的「发动机」用 state 表示资源状态用队列管理等待线程子类只定义「怎么抢、怎么放」其余排队、阻塞、唤醒都由它统一搞定。
AQS 是啥
AQS 在 Java 并发里通常指 AbstractQueuedSynchronizer抽象队列同步器。它是 JUCjava.util.concurrent里很多锁和同步工具的底层框架。ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock等都基于它实现。一、一句话理解AQS 用「一个状态变量 一个等待队列」管理线程抢资源、排队、唤醒的通用模板。你可以把它想成银行叫号系统state → 当前还有几个窗口/名额比如锁是否被占用CLH 队列 → 没抢到的人排队park/unpark → 叫到号唤醒你二、核心组成1.state状态一个volatile int表示同步状态含义由子类定义工具state 含义ReentrantLock0未锁0被锁可重入次数Semaphore剩余许可数CountDownLatch还剩几个线程没完成ReentrantReadWriteLock高 16 位读锁数低 16 位写锁数2. CLH 双向队列抢不到的线程会封装成 Node 放进 FIFO 队列里等待避免大量线程空转忙等。3. 模板方法子类只需实现两个方法// 尝试获取资源抢锁/抢许可 protected boolean tryAcquire(int arg) // 尝试释放资源放锁/还许可 protected boolean tryRelease(int arg)AQS 负责通用的排队、阻塞、唤醒逻辑。三、工作流程以独占锁为例获取锁简化理解public final void acquire(int arg) { // 1. 先试着抢 if (!tryAcquire(arg)) { // 2. 抢不到就入队 // 3. 自旋检查前驱是否是队头 // 4. 还不行就 park 挂起 } }释放锁public final boolean release(int arg) { if (tryRelease(arg)) { // 唤醒队列里下一个等待线程 unparkSuccessor(head); return true; } return false; }四、两种模式模式说明典型实现独占模式Exclusive同一时刻只有一个线程能拿到ReentrantLock、ReentrantReadWriteLock写锁共享模式Shared多个线程可同时拿到Semaphore、CountDownLatch、读写锁读锁五、和synchronized的区别synchronized基于 AQS 的锁如ReentrantLock实现JVM 内置监视器锁Java 代码实现灵活性自动加锁解锁可tryLock、可中断、可超时、可公平队列依赖 JVM 实现明确的 CLH 队列条件变量只有一个wait/notify可有多个ConditionReentrantLock比synchronized功能多就是因为 AQS 提供了可扩展的模板。六、代码里长什么样ReentrantLock内部有个继承 AQS 的同步器// 简化示意帮助理解 class Sync extends AbstractQueuedSynchronizer { protected boolean tryAcquire(int acquires) { final Thread current Thread.currentThread(); int c getState(); if (c 0) { // 没人占锁CAS 抢 if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current getExclusiveOwnerThread()) { // 重入同一线程再加锁 setState(c acquires); return true; } return false; } protected boolean tryRelease(int releases) { // 释放锁state 减到 0 时真正放开 ... } }业务代码只管lock()/unlock()排队和唤醒由 AQS 统一处理。七、为什么重要1. 面试常考AQS 是什么ReentrantLock和synchronized区别公平锁 / 非公平锁怎么实现2. 理解并发工具的原理知道 AQS 后Semaphore、CountDownLatch就不再是「黑盒 API」。3. 和项目的关系场景可能用到接口限流Semaphore等待多个任务完成CountDownLatch需要可中断/超时加锁ReentrantLock线程池底层也依赖 AQS 协调你们前面聊的数据库锁、分布式锁、事务解决的是数据层并发AQS 解决的是单机 JVM 内线程同步层次不同但都服务于「多线程不打架」。八、常见考点速记AQS 三件套state → 同步状态CLH 队列 → 等待线程排队CAS park → 抢资源 / 阻塞 / 唤醒子类实现tryAcquire → 怎么抢tryRelease → 怎么放基于 AQS 的工具ReentrantLockReentrantReadWriteLockSemaphoreCountDownLatchCyclicBarrier内部也用 ReentrantLock Condition九、一句话总结AQS 是 Java 并发包的「发动机」用 state 表示资源状态用队列管理等待线程子类只定义「怎么抢、怎么放」其余排队、阻塞、唤醒都由它统一搞定。