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