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):子类实现共享模式逻辑。
三、内部机制
- 状态管理:AQS通过
state变量记录同步状态,子类通过CAS操作修改状态。 - 队列管理:当线程无法获取锁或许可时,会被封装为Node节点,加入CLH等待队列。
- 阻塞与唤醒:线程在队列中阻塞,当同步状态被释放时,AQS会唤醒队列中的线程。
四、典型应用
- ReentrantLock:可重入独占锁,基于AQS实现。
- Semaphore:信号量,控制同时访问资源的线程数量。
- CountDownLatch:计数器,等待其他线程完成操作。
- ReentrantReadWriteLock:读写锁,读共享、写独占。
五、使用注意事项
- 子类必须实现同步状态操作方法:如
tryAcquire、tryRelease等。 - 避免死锁:在独占模式下,如果线程获取锁失败加入队列,应确保最终能释放锁。
- 性能优化:使用CAS操作减少锁竞争,提高并发性能。
六、总结
AQS是Java并发包的核心框架,通过状态管理和队列机制,提供了一套可扩展的同步器实现方案。它支撑了ReentrantLock、Semaphore、CountDownLatch等多种常用并发工具,使Java在高并发场景下能够稳定高效地管理线程同步。