AQS 的原理是什么?

Java 并发面试题发布于

一、定义

AQS(AbstractQueuedSynchronizer)是 JUC 锁的基础框架,用一个 int 状态变量(state)和一个 FIFO 等待队列实现同步。

二、核心

  • state:同步状态,0 表示空闲,>0 表示被占用。
  • CLH 队列:未获取锁的线程封装成 Node 入队,自旋 + 阻塞等待。

三、两种模式

  • 独占模式:同一时刻只有一个线程持有锁,如 ReentrantLock。
  • 共享模式:多个线程可同时持有,如 Semaphore、CountDownLatch。

四、获取锁流程

  1. 尝试 CAS 修改 state。
  2. 成功 → 获取锁。
  3. 失败 → 封装 Node 入队,park 阻塞。
  4. 前驱节点释放锁后 unpark 后继,后继重试。

五、子类实现

子类只需实现 tryAcquire/tryRelease(独占)或 tryAcquireShared/tryReleaseShared(共享),队列管理由 AQS 提供。