共计 1665 个字符,预计需要花费 5 分钟才能阅读完成。
AQS 概述
大家可能对 AQS 听得很多,它的全称是 AbstractQueuedSynchronizer,即形象队列同步器,它是 JUC 包中很多同步组件的根底。先来看看它的类档次以及外部数据结构吧。
public abstract class AbstractQueuedSynchronizer
extends AbstractOwnableSynchronizer
implements java.io.Serializable {
它的父类 AbstractOwnableSynchronizer 提供了领有独占锁的线程治理性能,有如下重要办法:
// 设置以后领有独占锁的线程
protected final void setExclusiveOwnerThread(Thread thread) {exclusiveOwnerThread = thread;}
// 获取以后领有独占锁的线程
protected final Thread getExclusiveOwnerThread() {return exclusiveOwnerThread;}
再来看 AQS 自身的内部结构。
要害属性:
// 头结点
private transient volatile Node head;
// 尾结点
private transient volatile Node tail;
// 锁状态
private volatile int state;
其中,Node 是 AQS 的外部类,它用来封装线程,组成一个双向的同步队列。代码如下:
static final class Node {
// SHARED/EXCLUSIVE 示意锁的模式
// 共享模式
static final Node SHARED = new Node();
// 独占模式
static final Node EXCLUSIVE = null;
// waitStatus 的值之一,示意以后结点因为超时或中断勾销获取锁。static final int CANCELLED = 1;
// waitStatus 的值之一,示意以后结点的后继结点须要被唤醒。static final int SIGNAL = -1;
// waitStatus 的值之一,示意以后结点处于 Condition 条件绑定的的期待队列中,等条件满足,以后结点会被从新移入同步队列中,期待获取锁。static final int CONDITION = -2;
// waitStatus 的值之一,示意以后结点开释共享资源时,须要把这个信息流传给其余结点,不止是它的后继结点。static final int PROPAGATE = -3;
// 以后线程的期待状态
volatile int waitStatus;
// 以后结点的前继结点
volatile Node prev;
// 以后结点的后继结点
volatile Node next;
// 封装的线程
volatile Thread thread;
// 期待队列中的下一个期待结点
// 或者非凡值 SHARED/EXCLUSIVE,用来记录是共享锁还是独占锁
Node nextWaiter;
// 判断是否共享锁
final boolean isShared() {return nextWaiter == SHARED;}
// 获取以后结点的前继结点
final Node predecessor() throws NullPointerException {
Node p = prev;
if (p == null)
throw new NullPointerException();
else return p;
}
Node() { // Used to establish initial head or SHARED marker}
Node(Thread thread, Node mode) { // Used by addWaiter
this.nextWaiter = mode;
this.thread = thread;
}
Node(Thread thread, int waitStatus) { // Used by Condition
this.waitStatus = waitStatus;
this.thread = thread;
}
这个先放一放,下次再更新,感兴趣的同学记得关注哦 ^_^
正文完