摘自《java并发编程的艺术》
Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到
Condition对象关联的锁。Condition对象是由Lock对象(调用Lock对象的newCondition()方法)创
建出来的,换句话说,Condition是依赖Lock对象的
Condtion的实现类CondtionObject是同步器AbstractQueuedSynchronizer的内部类。
一个Condition包含一个等待队列(FIFO),Condition拥有首节点(firstWaiter)和尾节点
(lastWaiter)
image.png
当前线程调用Condition.await()方法,将会以当前线程构造节点,并将节点从尾部
加入等待队列,
节点的更新不需要CAS保证,因为执行await()的线程必定是已经获取锁的。
Object的监视器模型上,一个对象拥有一个同步队列和等待队列。然而AQS上拥有一个同步队列和多个等待队列。
image.png
调用Condition的await()方法
当调用此方法,相当于同步队列的首节点(获取了锁的节点)移动到Condition的等待队列中。该方法当前线程构造成节点并加入等待队列中,然后释放同步状态,唤醒同步队列中的后继节点,然后当前线程会进入等待状态。
image.png
调用Condition的signal方法
调用该方法的前置条件是当前线程必须获取了锁,接着获取等待队列的首节点,将其移动到同步队列,当节点移动到同步队列后,当前线程再使用LockSupport唤醒该节点的线程。被唤醒后的线程,先会判断自己是否已经在同步队列中,进而调用同步器的acquireQueued()方法加入到获取同步状态的竞争中
image.png
网友评论