AQS介绍--1(属性介绍)

74 阅读2分钟

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

这个值表示,当前这个线程会唤醒下一个线程。