aqs overview

AbstractQueuedSynchronizer (AQS) 概览

AbstractQueuedSynchronizer(AQS)是Java并发包(java.util.concurrent)中用于构建锁和同步器的基础框架,核心思想是利用队列管理线程的获取和释放状态。

一、基本概念

  • 状态(State):AQS通过一个整数变量表示同步状态,如锁是否被占用或许可数量。
  • 独占模式(Exclusive Mode):只有一个线程能获取同步状态,例如ReentrantLock。
  • 共享模式(Shared Mode):多个线程可以共享同步状态,例如Semaphore、CountDownLatch。
  • 等待队列(CLH队列):AQS内部使用FIFO队列管理等待的线程。

二、核心方法

  • acquire(int arg):独占模式下获取同步状态,如果失败加入等待队列。
  • release(int arg):独占模式下释放同步状态,并唤醒等待队列中的线程。
  • acquireShared(int arg):共享模式获取同步状态。
  • releaseShared(int arg):共享模式释放同步状态。
  • tryAcquire(int arg) / tryRelease(int arg):由子类实现,定义具体的获取和释放规则。
  • tryAcquireShared(int arg) / tryReleaseShared(int arg):子类实现共享模式逻辑。

三、内部机制

  1. 状态管理:AQS通过state变量记录同步状态,子类通过CAS操作修改状态。
  2. 队列管理:当线程无法获取锁或许可时,会被封装为Node节点,加入CLH等待队列。
  3. 阻塞与唤醒:线程在队列中阻塞,当同步状态被释放时,AQS会唤醒队列中的线程。

四、典型应用

  • ReentrantLock:可重入独占锁,基于AQS实现。
  • Semaphore:信号量,控制同时访问资源的线程数量。
  • CountDownLatch:计数器,等待其他线程完成操作。
  • ReentrantReadWriteLock:读写锁,读共享、写独占。

五、使用注意事项

  • 子类必须实现同步状态操作方法:如tryAcquiretryRelease等。
  • 避免死锁:在独占模式下,如果线程获取锁失败加入队列,应确保最终能释放锁。
  • 性能优化:使用CAS操作减少锁竞争,提高并发性能。

六、总结

AQS是Java并发包的核心框架,通过状态管理和队列机制,提供了一套可扩展的同步器实现方案。它支撑了ReentrantLock、Semaphore、CountDownLatch等多种常用并发工具,使Java在高并发场景下能够稳定高效地管理线程同步。