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;
        }
    }
posted @ 2023-02-07 18:49  Cool_Yang  阅读(72)  评论(0编辑  收藏  举报