AQS,全称 AbstractQuenedSynchronizer, 能够了解为形象的队列同步器。
一、AQS 的核心思想
AQS 核心思想是,如果被申请的共享资源闲暇,则将以后申请资源的线程设置为无效的工作线程,并且将共享资源设置为锁定状态。如果被申请的共享资源被占用,那么就须要一套线程阻塞期待以及被唤醒时锁调配的机制,这个机制 AQS 是用 CLH 队列锁实现的,行将临时获取不到锁的线程退出到队列中。
二、实现原理
1、private volatile int state:AQS 应用一个 int 成员变量来示意同步状态,通过内置的 FIFO 队列来实现获取资源线程的排队工作。AQS 应用 CAS 对该同步状态进行原子操作实现对其值的批改。
// 获取状态 protected final int getState() { return state;}
// 设置状态值
protected final void setState(int newState) {state = newState;}
// 通过 CAS 批改状态
protected final boolean compareAndSetState(int expect, int update) { // See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
在 ReentrantLock 中,stste 示意获取锁的线程数,如果 state=0,示意还没有线程获取锁,1 示意有线程获取了锁。大于 1 示意重入锁的数量。
2、CLH(Craig,Landin,and Hagersten)队列是一个虚构的双向队列(虚构的双向队列即不存在队列实例,仅存在结点之间的关联关系)。AQS 是将每条申请共享资源的线程封装成一个 CLH 锁队列的一个结点(Node)来实现锁的调配。
三、ReentrantLock 中的偏心锁与非偏心锁
偏心锁:以后线程在抢锁之前先看看队列中是否有排队的线程,如果有则不容许抢,间接退出队列。
非偏心锁:以后线程在抢锁之前不须要查看队列中是否有排队的线程。
利用待补充