AQS深度探索:以ReentrantLock看Java并发编

发布时间:2026/7/1 9:45:28
AQS深度探索:以ReentrantLock看Java并发编 AQS ( Abstract Queued Synchronizer 是一个抽象的队列同步器通过维护一个共享资源状态 Volatile Int State 来表示同步状态 和一个先进先出 FIFO 的线程等待队列来完成资源获取的排队工作通过CAS完成对State值的修改。AQS整体框架如下当有自定义同步器接入时只需重写第一层所需要的部分方法即可不需要关注底层具体的实现流程。当自定义同步器进行加锁或者解锁操作时先经过第一层的API进入AQS内部方法然后经过第二层进行锁的获取接着对于获取锁失败的流程进入第三层和第四层的等待队列处理而这些处理方式均依赖于第五层的基础数据提供层原理AQS 为每个共享资源都设置一个共享资源锁线程在需要访问共享资源时首先需要获取共享资源锁如果获取到了共享资源锁便可以在当前线程中使用该共享资源如果获取不到则将该线程放入线程等待队列等待下一次资源调度流程图如下所示Java中的大部分同步类Lock、Semaphore、ReentrantLock等都是基于AbstractQueuedSynchronizer简称为AQS实现的。底层结构state状态Abstract Queued Synchronizer 维护了 volatile int 类型的变量用于表示当前的同步状态。volatile虽然不能保证操作的原子性但是能保证当前变量state的可见性。state的访问方式有三种 getState()、setState()和 compareAndSetState()均是原子操作其中compareAndSetState的实现依赖于 Unsafe的compareAndSwaplnt()java// java.util.concurrent.locks.AbstractQueuedSynchronizer private volatile int state; protected final int getState() { return state; } protected final void setState(int newState) { state newState; } protected final boolean compareAndSetState(int expect, int update) { // See below for intrinsics setup to support this return unsafe.compareAndSwapInt(this, stateOffset, expect, update); }CLH队列Craig、Landin and Hagersten队列是单向链表AQS中的队列是CLH变体的虚拟双向队列FIFOAQS是通过将每条请求共享资源的线程封装成一个节点来实现锁的分配。