AQS属性介绍
AQS全称,abstract queued synchronizer。这是一个Java提供的锁框架。用来实现Java层面的同步机制。 以下分为几个关键细节点来具体描述
state 以及相应方法
private volatile int state;
这个变量用来表示当前这个锁处于什么状态,例如在ReentrantLock中,0表示无锁,1表示上锁,大于1时表示这个锁被重入的次数。不可能小于0。同时这个值还被volatile修饰,以达到线程间可以共享这个这个变量,使得可以实时监控锁的状态。
setState
protected final void setState(int newState) {
state = newState;
}
在这个方法内部,没什么上锁的同步机制,可以推测,这个方法是用来解锁的。因为持有锁的仅仅只有一个线程。直接设置值就可以了!
compareAndSetState
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
这个方法内部利用了CAS操作进行加锁
protected final int getState()
protected final int getState() {
return state;
}
这个方法是返回当前锁的状态
AQS中的head,tail属性
private transient volatile Node head;
private transient volatile Node tail;
这两个属性是一个非常重要的属性,主要是用来当作阻塞线程的对列。
AQS父类的exclusiveOwnerThread
private transient Thread exclusiveOwnerThread;
这个属性主要是表明当前持有独占锁的线程,仅仅只有一个线程可以拿到锁
AQS内部类Node属性介绍
volatile Node prev;
volatile Node next;
volatile Thread thread;
static final int SIGNAL = -1;
static final int CANCELLED = 1;
static final Node EXCLUSIVE = null;
volatile int waitStatus;
前两个属性表明这个Node其实是一个双向链表串联起来的,thread是阻塞的对列被封装到了Node中,SIGNAL和CANCELLED是阻塞Node元素的两种状态,其实应该是5种,第5种是默认值0。而这个状态呢,主要是由变量waitStatus表示的,默认值是0,也是一种状态。仅仅说这三个状态。
CANCELLED
这个值表示,当前的线程可能后续会因为某些原因中断,取消
SIGNAL
这个值表示,当前这个线程会唤醒下一个线程。