Skip to main content

Java 并发

AbstractQueuedSynchronizer(AQS)

技术参考:https://tech.meituan.com/2019/12/05/aqs-theory-and-apply.html

Java 并发包(java.util.concurrent)中的一个核心类,位于 java.util.concurrent.locks 包中。它是构建锁和同步器的基础框架,提供了一个通用的机制来实现线程同步。AQS 的设计非常灵活,许多常用的同步工具(如 ReentrantLockSemaphoreCountDownLatchCyclicBarrier 等)都基于 AQS 实现。

AQS 的核心是一个基于 FIFO 队列的线程等待机制,它通过维护一个状态变量state)和等待队列CLH 队列)来管理线程的同步。其主要思想包括:

  • 状态变量(state
    • 用于表示同步状态,通常是一个 int 类型的变量。
    • 子类可以根据需要定义状态的含义,例如:
      • 在锁中,state 表示锁的获取状态(0 表示未锁定,1 表示锁定)。
      • 在信号量中,state 表示可用的许可数量。
  • FIFO 等待队列
    • 当线程尝试获取锁或同步资源而失败时,AQS 会将线程加入到一个 FIFO 等待队列中,直到资源可用时再唤醒线程。

AQS 的使用场景

AQS 是一个通用的同步框架,以下是一些基于 AQS 实现的常用同步工具:

  1. ReentrantLock
    • 独占模式,支持可重入锁。
  2. Semaphore
    • 共享模式,控制并发访问的许可数量。
  3. CountDownLatch
    • 共享模式,允许一个或多个线程等待其他线程完成。
  4. CyclicBarrier
    • 基于 AQS,允许一组线程相互等待,直到达到一个共同的屏障点。
  5. ReadWriteLock
    • 独占模式和共享模式的结合,允许多个线程同时读,或一个线程写。