AQS简单介绍

57 阅读1分钟

AQS 是什么?

AQS,全称 AbstractQueuedSynchronizer,是 Java 并发包(java.util.concurrent.locks)  的同步器框架基类

  • 它的定位

    一个实现锁和同步器的底层框架,封装了线程状态管理、FIFO 等待队列、阻塞/唤醒机制,让我们只需要关注“资源获取与释放”的逻辑,就能轻松实现各种并发工具(ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier 都基于它)。

  • 它自己不是锁,不能直接用,而是被继承来实现各种同步组件。

类的核心定义:

  • state:一个 volatile int,用来表示同步状态(不同同步器自定义含义)

    • 在 ReentrantLock 中,state 表示锁的重入次数
    • 在 Semaphore 中,state 表示当前可用的许可数量
    • 在 CountDownLatch 中,state 表示计数器数值
  • FIFO 等待队列(CLH队列) :存放获取资源失败的线程

为什么要有 AQS?

在没有 AQS 之前,如果我们要实现一个线程同步工具(比如自定义锁):

  • 需要自己管理等待线程队列
  • 需要自己调用 LockSupport.park/unpark 来阻塞或唤醒线程
  • 需要自己保证 线程安全、CAS 修改状态、唤醒顺序

这些写法非常复杂、容易出错。

 AQS 的作用
帮我们把这些复杂的通用逻辑打包好,包括:

  • 维护同步状态 state
  • 队列管理(FIFO)
  • 阻塞 / 唤醒线程

我们只需要继承 AQS,重写几个钩子方法(比如 tryAcquire / tryRelease),其他复杂的排队、阻塞、唤醒都交给 AQS 来做。