AQS(AbstractQueuedSynchronizer), 可以说的夸张点,并发包中的几乎所有类都是基于AQS的。

一起揭开AQS的面纱

1. 介绍

引用这位大佬的图 http://www.cnblogs.com/waterystone/p/4920797.html
JAVA并发(1)-AQS(亿点细节)-LMLPHP
这个图是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);
        }

为了讲清楚

05-21 22:56