Node的几个状态描述
volatile int waitStatus;
// 表示线程已取消
static final int CANCELLED = 1;
// 后继者的线程需要唤起
static final int SIGNAL = -1;
// 线程在等待条件
static final int CONDITION = -2;
// 下一个acquireShared应无条件传播
static final int PROPAGATE = -3;
SIGNAL:此节点的后继者(或将很快)被阻止(通过驻留),因此当前节点在释放或取消时必须取消其后继节点。为了避免竞争,获取方法必须首先指示它们需要信号,然后重试原子获取,然后在失败时阻止。
CANCELED:由于超时或中断,此节点被取消。节点永远不会离开这种状态。特别是,具有已取消节点的线程永远不会再次阻塞。
CONDITION :此节点当前处于条件队列中。在传输之前,它不会用作同步队列节点,此时状态将设置为0.(此处使用此值与字段的其他用法无关,但可简化机制。)
PROPAGATE:releaseShared应该传播到其他节点。在doReleaseShared中设置(仅限头节点)以确保继续传播,即使其他操作已经介入。
0:以上都不是
这些值以数字方式排列以简化使用。非负值意味着节点不需要发信号。因此,大多数代码不需要检查特定值,仅用于符号。
对于正常的同步节点,该字段初始化为0,对于条件节点,该字段初始化为CONDITION。它使用CAS(或者在可能的情况下,无条件的易失性写入)进行修改。