AQS(AbstractQueuedSynchronizer), 可以说的夸张点,并发包中的几乎所有类都是基于AQS的。
一起揭开AQS的面纱
1. 介绍
引用这位大佬的图 http://www.cnblogs.com/waterystone/p/4920797.html
这个图是AQS整体结构,从图中可以看到,AQS维护着一个阻塞队列(当线程获取资源失败时,就会进入该队列,等待,直到被唤醒), state是一个介绍一下Condition,但是源码有几处细节,让我头秃,在网上搜索别人的博客,这篇博客解开了我的疑惑,对Condition介绍的非常详细,写的非常的完美~
根据大佬的博客,那我们下面简单讲解Condition的两个常用方法
- await
- signal
2.6.1 await & signal
public final void await() throws InterruptedException {
if (Thread.interrupted())
throw new InterruptedException();
// 添加结点到条件队列中
Node node = addConditionWaiter();
// 释放当前线程持有的锁
int savedState = fullyRelease(node);
int interruptMode = 0;
// 不在同步队列中,就park
// (2.6.1)
while (!isOnSyncQueue(node)) {
// 执行到这,当前线程会立即挂起
LockSupport.park(this);
// 运行到这的话,情况: 1. signal 2. 中断
// 检验中断
// (2.6.2)
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
}
// 第二部分
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (node.nextWaiter != null) // clean up if cancelled
unlinkCancelledWaiters();
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
}
为了讲清楚