Condition是AQS的一个内部类,Condition维护了一个等待队列(这里区别一下同步队列)

  • 等待队列:Condition的队列
  • 同步队列:AQS的队列

    等待队列

    等待队列的节点也是AQS.Node节点。每个节点也保存着等待线程的信息。
    image.png
    当线程调用 await()方法后,该线程一定是获取了锁,所以加入等待队列的尾节点是没有必要CAS设置的。
    在synchronized的Object的监视器模型上,一个对象维护着一个同步队列和一个等待队列
    在并发包Lock中,拥有一个同步队列和多个等待队列,具体如下图:
    image.png

    等待await逻辑

    该线程获取到锁,并且当前处于队列的首节点。调用await()后会执行一下几步操作:

  • 把当前线程构造成AQS.Node加入Condition的队列(等待队列)

  • 唤醒同步队列中的后继节点

中断await()会抛异常
image.png

唤醒signal逻辑

获取锁的线程调用signal方法会有以下影响

  • 获取等待队列中的首节点
  • 将等待队列中的首节点加入到同步队列中的尾节点,并用LockSupport工具类唤醒

image.png

signalAll()就是对等待队列中的每个节点均执行一次signal