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; }
这个先放一放,下次再更新,感兴趣的同学记得关注哦^_^