AQS类
1.类图
- 红色线是内部类
- AbstractOwnableSynchronizer:抽象类,定义存储独占当前线程的属性和设置,获取当前线程的方法
- AbstractQueuenSynchronize:抽象类,AQS框架核心类,内部以虚拟队列的方式管理线程的锁获取与锁释放,其中获取锁(tryAcquire方法)和释放锁(tryRelease方法)并没有提供默认的实现,需要子类重写方法的具体逻辑,目的是使开发人可以自定义获取锁和释放锁的方式
- Node:AbstractQueuenSynchronize的内部类,用于构建虚拟队列(双向链表),为每个进入同步队列的线程封装成Node对象加入队列,管理需要获取锁的线程
- Sync:抽象类,是ReentrantLock的内部类,继承AbstractQueuenSynchronize,实现了tryRelease方法,并提供抽象方法lock,供子类实现
- NonfairSync:Reentrantlock的内部类,继承Sync,非公平锁的实现类
- FairSync:Reentrantlock的内部类,继承Sync,公平锁的实现类
- Reentrantlock:实现了Lock接口,创建时默认为非公平锁
2.略解
- AQS采用的是模板方法模式,其内部除了提供并发的操作核心方法以及同步队列的操作之外,还提供了一些模板方法让子类自己实现,如加锁解锁
- 原理部分详解
AQS底层结构
- 基础部分请看上篇
1.state
- state=0:表示没有线程正在独占共享资源的锁
- state=1:表示有线程正在共享资源的锁
2.CLH队列
- Node内部结构
- 同步队列增删节点工作流程
- 等待队列增删节点工作流程
源码解读(acquire)
1.流程
2.源码
- 入口:ReentrantLock的AQS的acquire()
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
------------------------------------------
private Node addWaiter(Node mode) {
Node node = new Node(Thread.currentThread(), mode);
Node pred = tail;
if (pred != null) {
node.prev = pred;
if (compareAndSetTail(pred, node)) {
pred.next = node;
return node;
}
}
enq(node);
return node;
}
------------------------------------------
private Node enq(final Node node) {
for (;;) {
Node t = tail;
if (t == null) {
if (compareAndSetHead(new Node()))
tail = head;
} else {
node.prev = t;
if (compareAndSetTail(t, node)) {
t.next = node;
return t;
}
}
}
}
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
------------------------------------------
final boolean acquireQueued(final Node node, int arg) {
boolean failed = true;
try {
boolean interrupted = false;
for (;;) {
final Node p = node.predecessor();
if (p == head && tryAcquire(arg)) {
setHead(node);
p.next = null;
failed = false;
return interrupted;
}
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
} finally {
if (failed)
cancelAcquire(node);
}
}
------------------------------------------
private static boolean shouldParkAfterFailedAcquire(Node pred, Node node) {
int ws = pred.waitStatus;
if (ws == Node.SIGNAL)
return true;
if (ws > 0) {
do {
node.prev = pred = pred.prev;
} while (pred.waitStatus > 0);
pred.next = node;
} else {
compareAndSetWaitStatus(pred, ws, Node.SIGNAL);
}
return false;
}
------------------------------------------
private final boolean parkAndCheckInterrupt() {
LockSupport.park(this);
return Thread.interrupted();
}
public final void acquire(int arg) {
if (!tryAcquire(arg) &&
acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
selfInterrupt();
}
------------------------------------------
static void selfInterrupt() {
Thread.currentThread().interrupt();
}
源码解读(release)
public final boolean release(int arg) {
if (tryRelease(arg)) {
Node h = head;
if (h != null && h.waitStatus != 0)
unparkSuccessor(h);
return true;
}
return false;
}
-------------------------------------
private void unparkSuccessor(Node node) {
int ws = node.waitStatus;
if (ws < 0)
compareAndSetWaitStatus(node, ws, 0);
Node s = node.next;
if (s == null || s.waitStatus > 0) {
s = null;
for (Node t = tail; t != null && t != node; t = t.prev)
if (t.waitStatus <= 0)
s = t;
}
if (s != null)
LockSupport.unpark(s.thread);
}