AbstractQueuedSynchronizer.ConditionNode::doSignal源码笔记

/**
* Removes and transfers one or all waiters to sync queue.
*/
private void doSignal(ConditionNode first, boolean all) {
     while (first != null) {
          ConditionNode next = first.nextWaiter;
          // 如果first是当前等待的最后一个ConditionNode,重置firstWaiter、lastWaiter
          if ((firstWaiter = next) == null)
               lastWaiter = null;
          // getAndUnsetStatus的返回值是执行unset操作前的state,如果COND位有效,那么这个式子就!=0
          if ((first.getAndUnsetStatus(COND) & COND) != 0) {
               // 将first退出等待队列并加入待执行队列
               enqueue(first);
               // 如果all为true说明执行了signalAll,需要再进循环
               if (!all)
                    break;
          }
          first = next;
     }
}

 

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