同步器节点的waitStatus解释

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;
}

 

你可能感兴趣的:(Java并发-AQS同步队列)