AbstractQueuedSynchronizer.ConditionNode::await源码笔记

public final void await() throws InterruptedException {
     if (Thread.interrupted())
          throw new InterruptedException();
     ConditionNode node = new ConditionNode();
     // 1.将当前线程持有的锁释放
     // 2.根据当前线程设置node的各项参数,并将node加入等待队列
     // 3.返回持有锁时的状态savedState,之后被唤醒并重新获取锁的时候会用到
     int savedState = enableWait(node);
     LockSupport.setCurrentBlocker(this); // for back-compatibility
     boolean interrupted = false, cancelled = false;
     // 一直进行循环知道当前线程可以重新获取锁
     // canReacquire函数的原理是监测node当前是否已经脱离等待队列进入了待执行队列
     while (!canReacquire(node)) {
          if (interrupted |= Thread.interrupted()) {
               if (cancelled = (node.getAndUnsetStatus(COND) & COND) != 0)
                    break;              // else interrupted after signal
          } else if ((node.status & COND) != 0) {
               try {
                    ForkJoinPool.managedBlock(node);
               } catch (InterruptedException ie) {
                    interrupted = true;
               }
          } else
               Thread.onSpinWait();    // awoke while enqueuing
     }
     LockSupport.setCurrentBlocker(null);
     node.clearStatus();
     // 走到这里说明线程被重新唤醒,使用savedState重新获取锁
     acquire(node, savedState, false, false, false, 0L);
     if (interrupted) {
          if (cancelled) {
               unlinkCancelledWaiters(node);
               throw new InterruptedException();
          }
          Thread.currentThread().interrupt();
     }
}

 

posted @ 2021-04-21 21:25  榆木脑袋0v0  阅读(71)  评论(0)    收藏  举报