AbstarctQueuedSynchronizer 源碼分析和框架思想

引言

 


Node類

Node類是AQS中的final內部類,

static final class Node {

    
    static final Node SHARED = new Node(); /** 共享模式的Node */
    static final Node EXCLUSIVE = null;   /** 互斥模式的Node */

    volatile int waitStatus; // 線程狀態,可以從下面四種中取值
    static final int CANCELLED =  1;  // 表明線程已經取消等待 
    static final int SIGNAL    = -1;  // 表明持鎖線程的後繼線程需要unparking 
    static final int CONDITION = -2;  // 表明線程正在等待condition
    static final int PROPAGATE = -3;

    volatile Node prev; // 前驅節點
    volatile Node next; // 後繼節點
 
    volatile Thread thread;
    Node nextWaiter;

}

AQS類

private transient volatile Node head; // 等待序列的頭結點
private transient volatile Node tail; // 等待序列的尾結點
private volatile int state; // 同步狀態

private static final Unsafe unsafe = Unsafe.getUnsafe();
// stateOffset、headOffset、tailOffset分別用於存放上述三個實例變量的內存偏移量
// 這些內存偏移量用於CAS操作:unsafe.compareAndSwapInt(this, stateOffset, expect, update);
private static final long stateOffset;
private static final long headOffset;
private static final long tailOffset;
// 上述三個是對AQS類實例變量CAS操作準備偏移量,下面兩個是爲Node的實例變量CAS操作做準備
private static final long waitStatusOffset;
private static final long nextOffset;
// objectFieldOffset()方法用於獲取某個字段相對Java對象的“起始地址”的偏移量
static {
        try {
            stateOffset = unsafe.objectFieldOffset
                (AbstractQueuedSynchronizer.class.getDeclaredField("state"));
            headOffset = unsafe.objectFieldOffset
                (AbstractQueuedSynchronizer.class.getDeclaredField("head"));
            tailOffset = unsafe.objectFieldOffset
                (AbstractQueuedSynchronizer.class.getDeclaredField("tail"));
            waitStatusOffset = unsafe.objectFieldOffset
                (Node.class.getDeclaredField("waitStatus"));
            nextOffset = unsafe.objectFieldOffset
                (Node.class.getDeclaredField("next"));

        } catch (Exception ex) { throw new Error(ex); }
}

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章