AbstractQueuedSynchronizer属性
/**
* 同步队列的头节点
*/
private transient volatile Node head;
/**
* 同步队列尾节点,enq 加入
*/
private transient volatile Node tail;
/**
* 同步状态
*/
private volatile int state;
/**
* 获取状态
*/
protected final int getState() {
return state;
}
/**
* 设置状态
*/
protected final void setState(int newState) {
state = newState;
}
/**
* CAS 设置状态
*/
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
/**
* The number of nanoseconds for which it is faster to spin
* rather than to use timed park. A rough estimate suffices
* to improve responsiveness with very short timeouts.
*/
static final long spinForTimeoutThreshold = 1000L;
Node 节点属性
static final class Node {
/** 共享节点 */
static final Node SHARED = new Node();
/** 独占节点 */
static final Node EXCLUSIVE = null;
// 在同步队列中等待的线程等待超时或被中断, 需要从同步队列中取消等待, 状态不会变化 |
static final int CANCELLED = 1;
// 后继节点处于等待状态, 当前节点释放了同步状态或者被取消, 通知后续节点, 使后续节点得以运行
static final int SIGNAL = -1;
// 值为-2, 节点在等待队列, 当其他线程 signal(),从等待队列中移除到同步队列中 |
static final int CONDITION = -2;
// 值为-3, 下一次共享获取同步状态将会无条件传播下去
static final int PROPAGATE = -3;
/**
* 节点初始状态,初始化为0
*/
volatile int waitStatus;
/**
* 前一个节点
*/
volatile Node prev;
/**
* 后一个节点
*/
volatile Node next;
/*
* 节点的线程
*/
volatile Thread thread;
/**
* 下一个等待者
*/
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;
}
}