AQS 中的 Node 内部类
AQS 中的 Node 内部类
Node 内部类
Node 的主要作用:作为等待队列的节点存在
1.作为同步等待队列中的节点存在 (nextWaiter值为 SHARED/EXCLUSIVE 表示,该节点在某种模式下等待 )
2.作为条件等待队列的节点存在(nextWaiter值为下一个节点,注意条件等待队列事单链表)
Node 源码
static final class Node {
/**
* 标记:该节点正在共享模式下等待
*/
static final Node SHARED = new Node();
/**
* 标记:该节点正在独占模式下等待
*/
static final Node EXCLUSIVE = null;
// =================== waitStatus 状态值 ===================
static final int CANCELLED = 1;
static final int SIGNAL = -1;
static final int CONDITION = -2;
static final int PROPAGATE = -3;
/**
* 该值只有以下几个状态:
* CANCELLED: 取消状态:表示该线程已取消(该节点因超时或中断而被取消)
* SIGNAL: 通知状态:指示后续线程需要被唤醒(注意:这个状态一般都是由后继的线程设置的)
* CONDITION: 条件等待状态 :当前节点在 Condition 节点队列当中,节点在等待 Condition 通知
* PROPAGATE: 传播状态:指示下一个 acquireShared 应无条件传播(将唤醒后继线程的能力,传递下去,主要用在共享模式下)
* 0: 以上都不是
*
*/
volatile int waitStatus;
/**
* 前驱节点
*/
volatile Node prev;
/**
* 后继节点
*/
volatile Node next;
/**
* 该节点的线程
*/
volatile Thread thread;
/**
* 取值范围:Node.SHARED ,Node.EXCLUSIVE
* SHARED: 共享模式
* EXCLUSIVE: 独占模式 (在条件队列下:表示条件队列当中的后继节点,链接到下一个等待条件的节点,单向链表)
*/
Node nextWaiter;
/**
* 如果节点在共享模式下等待,则返回true。
*/
final boolean isShared() {
return nextWaiter == SHARED;
}
/**
* 返回上一个节点,如果为null,则抛出NullPointerException。
* 当前置项不能为空时使用。空检查可能被取消,但存在以帮助VM。
*/
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;
}
}