Condition是AQS的一个内部类,Condition维护了一个等待队列(这里区别一下同步队列)
- 等待队列:Condition的队列
-
等待队列
等待队列的节点也是AQS.Node节点。每个节点也保存着等待线程的信息。
当线程调用await()
方法后,该线程一定是获取了锁,所以加入等待队列的尾节点是没有必要CAS设置的。
在synchronized的Object的监视器模型上,一个对象维护着一个同步队列和一个等待队列
在并发包Lock中,拥有一个同步队列和多个等待队列,具体如下图:
等待await逻辑
该线程获取到锁,并且当前处于队列的首节点。调用
await()
后会执行一下几步操作: 把当前线程构造成AQS.Node加入Condition的队列(等待队列)
- 唤醒同步队列中的后继节点
唤醒signal逻辑
获取锁的线程调用signal方法会有以下影响
- 获取等待队列中的首节点
- 将等待队列中的首节点加入到同步队列中的尾节点,并用LockSupport工具类唤醒
signalAll()就是对等待队列中的每个节点均执行一次signal