aqs原理
时间: 2025-03-07 12:05:01 浏览: 50
### Java AQS (AbstractQueuedSynchronizer) 原理详解
#### AQS概述
AQS 是一个用于构建锁和其他同步组件的基础框架。此框架的核心思想在于使用单个 `volatile` 整形变量 `state` 来表示同步状态,并通过内置的 FIFO 队列来完成获取和释放同步状态时的排队工作[^3]。
#### 同步状态管理
AQS 使用一个名为 `state` 的私有成员变量来保存同步状态,这个变量被声明为 `volatile` 类型以确保多线程环境下的可见性和有序性。对于不同的同步器而言,`state` 可能代表的意义有所不同。例如,在 `ReentrantLock` 中,`state` 表示的是持有锁的数量;而在 `Semaphore` 中,则可能表示剩余许可数[^5]。
#### 线程竞争处理
当多个线程尝试访问受保护资源时,如果当前线程无法立即获得所需的同步状态(比如因为已经被占用),那么该线程将会加入到由 AQS 维护的一个先进先出(FIFO)队列之中等待。每当某个线程成功释放了其持有的同步状态之后,处于队首位置的那个等待线程便有机会重新尝试获取同步状态并继续执行下去。
#### 自定义同步逻辑实现
为了适应各种各样的需求场景,开发者可以通过继承自 `AbstractQueuedSynchronizer` 并覆盖其中的关键方法来自定义特定类型的同步行为。具体来说:
- 对于独占模式下使用的同步器(如 `ReentrantLock`),通常会重载 `tryAcquire(int arg)` 和 `tryRelease(int arg)` 方法;
- 而共享模式则适用于允许多个线程同时拥有相同权限的情况(像信号量),此时应着重关注 `tryAcquireShared(int arg)` 和 `tryReleaseShared(int arg)` 这两个函数的编写[^2]。
```java
// 定义一个新的同步器类
public class MySync extends AbstractQueuedSynchronizer {
protected boolean tryAcquire(int acquires) { /* ... */ }
protected boolean tryRelease(int releases) { /* ... */ }
// 如果是共享模式还需要实现如下方法
protected int tryAcquireShared(int acquires) { /* ... */ }
protected boolean tryReleaseShared(int releases) { /* ... */ }
}
```
#### CAS操作保障原子性
由于存在并发修改的可能性,所以在更改 `state` 的时候必须采取措施防止竞态条件的发生。为此,AQS 利用了硬件层面提供的比较交换指令(CAS Compare And Swap)来进行无锁编程,从而保证了对 `state` 更新过程的安全可靠[^4]。
阅读全文
相关推荐



















