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

猜你喜欢

转载自blog.csdn.net/WalleIT/article/details/88622458
今日推荐