深入理解Java AQS 原理
深入理解JavaAQS原理
知识点助记
可以把AQS想象成一个“交通指挥系统”
- 红绿灯 = AQS的状态管理(state变量)
- 等待的车流 = 堵塞的线程队列
- 交警的指挥 = AQS的排队和唤醒机制
- 不同车道 = 独占模式 和 共享模式
其核心价值在于:用统一的规则管理谁可以通过(获取锁),谁需要等待以及什么时候放行。
解析
AQS 是 AbstractQueuedSynchronizer 的简称,它是 JDK1.5 引入的一个抽象类,提供了基于FIFO等待队列的线程同步机制。
// 1. 状态管理 - 红绿灯状态 |
好处
在AQS出现之前,每个同步工具都要自己实现线程同步机制。
AQS主要是统一了同步器的实现模式,减少线程上下文切换。
使用
主要有三种方法可以使用AQS
- 继承AQS实现自定义锁
public class MyLock extends AbstractQueuedSynchronizer { |
- 使用AQS实现的现有工具
// 可重入锁 - 独占模式 |
- 理解AQS的两种模式
- 独占模式:一个时刻只有一个线程能访问(ReentrantLock)
- 共享模式:多个线程可以同时访问(Semaphore,CountDownLatch)
注意事项
AQS不是锁,他是构建锁和同步器的框架,不是锁本身。
AQS的state不止可以标识锁的状态,state是int变量。(Semaphore的许可书,CountDownLatch的计数等)
AQS是抽象类,不能直接被使用,需要继承后重写tryAcquire/tryRelease等方法
独占模式和共享模式
| 特性 | 独占模式 | 共享模式 |
|---|---|---|
| 使用场景 | 互斥访问 | 资源池、限流 |
| 实现 | ReentrantLock | Semaphore |
| 线程关系 | 竞争关系 | 协作关系 |
| 状态含义 | 0-未锁定 1-锁定 | 可用资源数 |
相关文章推荐
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 花海!
