/**
* 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;
}
}