CANCELLED 取消状态
SIGNAL 等待触发状态,前节点可能是head或者前节点为取消状态CANCELLED
CONDITION 等待条件状态,在等待队列中
PROPAGATE 状态需要向后传播
让我们看看AbstractQueuedSynchronizer
改变状态的方法:shouldParkAfterFailedAcquire(Node pred, Node node)
/
* @param pred 前继节点
* @param node 当前节点
/
private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
int ws = pred.waitStatus;
if (ws == Node.SIGNAL)
/*
*
* 前继节点还在等待触发,还没当前节点的什么事儿,所以当前节点可以被park
*/
return true;
if (ws > 0) {
/*
* 前继节点是CANCELLED ,则需要充同步队列中删除,并检测新接上的前继节点的状态,若还是为CANCELLED ,还需要重复上述步骤
*/
do {
node.prev = pred = pred.prev;
} while (pred.waitStatus > 0);
pred.next = node;
} else {
/*
* 到这一步,waitstatus只有可能有2种状态,一个是0,一个是PROPAGATE,无论是哪个都需要把当前节点的状态设置为SIGNAL
*/
compareAndSetWaitStatus(pred, ws, Node.SIGNAL);
}
return false;
}