AQS是什么
时间: 2025-04-24 17:14:58 浏览: 18
### AQS(AbstractQueuedSynchronizer)概念解析
#### 定义与继承关系
AQS是一个用于构建锁和其他同步器组件的基础框架,该类位于`java.util.concurrent.locks`包下。作为Java并发工具库中的核心部分之一,AQS提供了一种机制来管理线程间的同步访问控制[^1]。
#### 底层数据结构
AQS内部维护了一个FIFO的等待队列,这个队列由多个节点组成,每个节点代表一个正在等待获取资源的线程。为了提高效率并简化实现逻辑,此队列采用带头结点的设计模式,在首次有线程加入时才会真正创建头结点[^4]。此外,AQS还定义了一些关键属性:
- `private transient volatile Node head;`: 队列头部指针;
- `private transient volatile Node tail;`: 队列尾部指针;
- `private volatile int state;`: 表示同步状态的一个整型字段,通常用来表示可用许可的数量或者计数器值等[^2];
这些成员变量均使用了`volatile`关键字修饰,确保多线程环境下的可见性和有序性约束得到满足。
#### 工作原理概述
当某个线程试图获取独占或共享类型的锁定时,它会调用相应的方法尝试修改`sate`值。如果当前线程能够成功更新`sate`(比如通过CAS操作),则意味着获得了所需的权限;反之,则会被封装成一个新的Node对象并挂载到上述提到的CLH队列末端成为新的尾节点[^3]。之后,该线程将阻塞直到被前驱节点唤醒继续执行下去。
```java
// 示例代码片段展示如何基于AQS实现自定义同步原语
public class MyLock extends AbstractQueuedSynchronizer {
protected boolean tryAcquire(int acquires) {
if (compareAndSetState(0, 1)) {
setExclusiveOwnerThread(Thread.currentThread());
return true;
}
return false;
}
@Override
protected boolean tryRelease(int releases) {
if (getState() == 0) throw new IllegalMonitorStateException();
setState(0);
setExclusiveOwnerThread(null);
return true;
}
}
```
阅读全文
相关推荐

















