深入理解JavaAQS原理

知识点助记

可以把AQS想象成一个“交通指挥系统”

  • 红绿灯 = AQS的状态管理(state变量)
  • 等待的车流 = 堵塞的线程队列
  • 交警的指挥 = AQS的排队和唤醒机制
  • 不同车道 = 独占模式 和 共享模式

其核心价值在于:用统一的规则管理谁可以通过(获取锁),谁需要等待以及什么时候放行。

解析

AQS 是 AbstractQueuedSynchronizer 的简称,它是 JDK1.5 引入的一个抽象类,提供了基于FIFO等待队列的线程同步机制。

// 1. 状态管理 - 红绿灯状态
private volatile int state;

// 2. 等待队列 - 排队的车辆
private transient volatile Node head;
private transient volatile Node tail;

// 3. 节点类型 - 不同的等待模式
static final class Node {
// 共享模式、独占模式、条件等待等
}

好处

在AQS出现之前,每个同步工具都要自己实现线程同步机制。
AQS主要是统一了同步器的实现模式,减少线程上下文切换。

使用

主要有三种方法可以使用AQS

  1. 继承AQS实现自定义锁
public class MyLock extends AbstractQueuedSynchronizer {

// 尝试获取锁
protected boolean tryAcquire(int arg) {
return compareAndSetState(0, 1); // CAS操作
}

// 尝试释放锁
protected boolean tryRelease(int arg) {
setState(0); // 重置状态
return true;
}
}
  1. 使用AQS实现的现有工具
// 可重入锁 - 独占模式
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 临界区
} finally {
lock.unlock();
}

// 信号量 - 共享模式
Semaphore semaphore = new Semaphore(5);
semaphore.acquire(); // 获取许可
  1. 理解AQS的两种模式
  • 独占模式:一个时刻只有一个线程能访问(ReentrantLock)
  • 共享模式:多个线程可以同时访问(Semaphore,CountDownLatch)

注意事项

AQS不是锁,他是构建锁和同步器的框架,不是锁本身。
AQS的state不止可以标识锁的状态,state是int变量。(Semaphore的许可书,CountDownLatch的计数等)
AQS是抽象类,不能直接被使用,需要继承后重写tryAcquire/tryRelease等方法

独占模式和共享模式

特性 独占模式 共享模式
使用场景 互斥访问 资源池、限流
实现 ReentrantLock Semaphore
线程关系 竞争关系 协作关系
状态含义 0-未锁定 1-锁定 可用资源数

相关文章推荐