一. 简介
使用 Condition 可以让线程等待不同条件,典型的例子就是 ArrayBlockingQueue。
二. 源码解析
Condition 接口的具体实现是在 AbstractQueuedSynchronized 类中一个叫做 ConditionObject 的内部类。
核心字段:
/** condition 队列的第一个节点 */
private transient Node firstWaiter;
/** condition 队列的最后一个节点 */
private transient Node lastWaiter;
- await() 方法:实现了可中断的条件等待
(1)如果当前线程中断,抛出中断异常
(2)保存锁状态通过 getStat 返回
(3)调用 release,参数是已保存的状态
(4)线程阻塞直到 signal 或者中断
(5)调用特定的 acquire 重新获取
(6)如果在(4)中断的话,抛出中断异常
- public final void await() throws InterruptedException {
- if (Thread.interrupted())
- throw new InterruptedException();
- Node node = addConditionWaiter();
- int savedState = fullyRelease(node);
- int interruptMode = 0;
- while (!isOnSyncQueue(node)) {
- LockSupport.park(this);
- if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
- break;
- }
- if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
- interruptMode = REINTERRUPT;
- if (node.nextWaiter != null)
- unlinkCancelledWaiters();
- if (interruptMode != 0)
- reportInterruptAfterWait(interruptMode);
- }
2. signal() 方法:
- public final void signal() {
- if (!isHeldExclusively())
- throw new IllegalMonitorStateException();
- Node first = firstWaiter;
- if (first != null)
- doSignal(first);
- }
-
- private void doSignal(Node first) {
- do {
- if ( (firstWaiter = first.nextWaiter) == null)
- lastWaiter = null;
- first.nextWaiter = null;
-
- } while (!transferForSignal(first) &&
- (first = firstWaiter) != null);
- }
3.
signalAll() 方法:
- public final void signalAll() {
- if (!isHeldExclusively())
- throw new IllegalMonitorStateException();
- Node first = firstWaiter;
- if (first != null)
- doSignalAll(first);
- }
- private void doSignalAll(Node first) {
- lastWaiter = firstWaiter = null;
- do {
- Node next = first.nextWaiter;
- first.nextWaiter = null;
- transferForSignal(first);
- first = next;
- } while (first != null);
- }
转载自:https://blog.csdn.net/wenniuwuren/article/details/51447767