Java之AQS
2022-06-28 15:58:22 13 举报
AI智能生成
Java之AQS
作者其他创作
大纲/内容
基本介绍
AbstractQueuedSynchronizer抽象队列同步器
可用于构建阻塞锁或者其他相关同步器的基础框架,是Java并发包的基础工具类
对同步状态原子性管理、线程的阻塞和解除阻塞、队列的管理进行统一管理
AQS作为J.U.C的工具类,面向的是需要实现锁的实现者,而锁面向的是锁的使用者
AQS是抽象类,并不能直接实例化,当需要使用AQS的时候需要继承AQS抽象类并且重写指定的方法
通过CAS操作维护共享变量state
重写资源获取、释放的方式
队列的维护(获取资源失败入队、线程唤醒、线程的状态等)AQS已经实现
模板方法模式
数据结构
成员变量
头结点,你直接把它当做 当前持有锁的线程 可能是最好理解的
private transient volatile Node head;
阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表
private transient volatile Node tail;
代表当前锁的状态,0代表没有被占用,大于0代表有线程持有当前锁
private volatile int state;
代表当前持有独占锁的线程,举个最重要的使用例子,因为锁可以重入
reentrantLock.lock()可以嵌套调用多次,所以每次用这个来判断当前线程是否已经拥有了锁
if (currentThread == getExclusiveOwnerThread()) {state++}
private transient Thread exclusiveOwnerThread; //继承自AbstractOwnableSynchronizer
if (currentThread == getExclusiveOwnerThread()) {state++}
private transient Thread exclusiveOwnerThread; //继承自AbstractOwnableSynchronizer
内部结构
双向链表
同步队列
储存的是处于等待状态的线程,正在排队等待唤醒去获取锁
单向链表
条件队列
储存的也是处于等待状态的线程,只不过这些线程唤醒的结果是加入到了同步队列的队尾
AQS所做的就是管理这两个队列里面线程之间的等待状态-唤醒的工作
获取资源方式
独占模式
独占模式即一个线程获取到资源后,其他线程不能再对资源进行任何操作,只能阻塞获得资源。
共享模式
共享模式下,线程无论是获取资源还是释放资源,都可能会唤醒后继节点。
0 条评论
下一页