直接回答:AQS(AbstractQueuedSynchronizer)是 java.util.concurrent 包中锁与同步器的基座。核心由两部分组成:一个 volatile int state 表示同步状态,加一个 CLH 变体的 FIFO 双向队列存放排队等待的线程。子类通过重写几个模板方法即可获得自己的同步语义。

展开解析:以独占模式为例——acquire() 调用子类实现的 tryAcquire()(通常用 CAS 修改 state);失败则把当前线程包装成 Node 入队,随后 LockSupport.park() 挂起;持有锁的线程 release()tryRelease() 释放 state,并 unpark() 唤醒队首后继节点重新竞争。共享模式(acquireShared)类似,但唤醒会向后传播,用于 Semaphore、CountDownLatch 等。

关键点

  • state 的含义由子类定义:ReentrantLock 用它记录重入次数,Semaphore 表示剩余许可数,CountDownLatch 表示剩余计数;
  • state 的修改走 CAS,队列头尾指针变更也靠 CAS,保证无锁下的正确性;
  • 公平与非公平的差别仅在 tryAcquire 时是否先检查队列中是否有前驱;
  • Node 的 waitStatus 管理取消、等待、传播等状态。

应用与追问:ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock 均基于 AQS。追问:Condition 的条件队列与同步队列如何联动、共享模式的传播唤醒。