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