AQS


AQS 是 Java 并包里实现锁、同的一个重要的基架。

AQS内部维护了一个等待借助CAS方法实现算法行更新

 

 

AQS定义两种资源共享方式

 

Exclusive(独占,有一个线程能行,如ReentrantLock)

Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)

 

 

AQS使用一个Volatile的int型的成员变量来表示同

内置的FIFO列来完成取的排工作

CAS完成State的修改

CLH?k51J(FIFO)  head

 

 

 

Node

用于存放线程的, 存在于 Sync Queue, Condition Queue, 点主要的区分在于 waitStatus 的

 

Condition Queue

列是用于独占模式中,有用到 Condition.awaitXX 才会将 node加到 tail

 

Sync Queue

独占共享的模式中均会使用到的存放 Node 的 CLH queue(主要特点是列中有一个 dummy 点,后继节的条件由前继节点决定,

继节点在放 lock 醒sleep中的后继节点)

 

ConditionObject,用于独占的模式,主要是线放lock,加入Condition Queue, 并行相的 signal 操作

独占的取lock (acquire release) 例如 ReentrantLock。

 

共享的取lock (acquireShared releaseShared)。 例如 ReeantrantReadWriteLock, Semaphore

 

 

static final class Node {

    /** 标识节点是否是 共享的点(这样存在于 Sync Queue 里面) */

    static final Node SHARED = new Node();

    #//独占模式

    static final Node EXCLUSIVE = null;

    #/**

    # *  CANCELLED 点已 取消取 lock 了(一般是由于 interrupt 或 timeout 致的)

    # *  候是在 cancelAcquire 里面标识

    # */

    static final int CANCELLED = 1;

 

    #/**

    # * SIGNAL 标识当前点的后继节点需要醒(PS: 个通常是在 独占模式下使用, 在共享模式下有用 PROPAGATE)

    # */

    static final int SIGNAL = -1;

 

    #//当前点在 Condition Queue 里面

    static final int CONDITION = -2;

 

    /**

     * 当前取到 lock 或行 release lock , 共享模式的最是 PROPAGATE(PS: 有可能共享模式的成 PROPAGATE 之前就被其后继节占 head 点, 而Sync Queue中被)

     */

    static final int PROPAGATE = -3;

 

    volatile int waitStatus;

 

    /**

     * 点在 Sync Queue 里面的前继节点(主要来行 skip CANCELLED 的点)

     * 注意: 根 addWaiter方法:

     *  1. prev点在列里面, prev != null 定成立

     *2. prev != null 成立, 不一定 node 就在 Sync Queue 里面

     */

    volatile Node prev;

 

    /**

     * Node 在 Sync Queue 里面的后继节点, 主要是在release lock 时进行后继节点的

     * 而后继节点在前继节点上打上 SIGNAL 标识, 来提醒他 release lock 需要

     */

    volatile Node next;

 

    //取 lock 的引用

    volatile Thread thread;

 

    /**

     * 作用分成两种:

     *  1. 在 Sync Queue 里面, nextWaiter用来判断点是 共享模式, 是独占模式

     *  2. 在 Condition queue 里面, 点主要是接且后继节点 (Condition queue是一个向的, 不支持并的 list)

     */

    Node nextWaiter;

 

    // 当前点是否是共享模式

    final boolean isShared() {

        return nextWaiter == SHARED;

    }

 

    // 取 node 的前继节

    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 用于 Sync Queue 里面

    Node(Thread thread, Node mode){     // Used by addWaiter

        this.nextWaiter = mode;

        this.thread = thread;

    }

 

    //初始化 Node 用于 Condition Queue 里面

    Node(Thread thread, int waitStatus){ // Used by Condition

        this.waitStatus = waitStatus;

        this.thread = thread;

    }

}