发布网友 发布时间:2025-01-27 07:29
共1个回答
热心网友 时间:2025-01-27 07:28
回忆 synchronized 关键字,它配合 Object 的 wait()、notify() 系列方法可以实现等待/通知模式。对于 Lock,通过 Condition 也可以实现等待/通知模式。Condition 是一个接口,其实现类是 Lock(AQS)中的 ConditionObject。Lock 接口中有个 newCondition() 方法,通过这个方法可以获得 Condition 对象(其实就是 ConditionObject)。因此,通过 Lock 对象可以获得 Condition 对象。Lock lock = new ReentrantLock(); Condition c1 = lock.newCondition(); Condition c2 = lock.newCondition();
ConditionObject 类是 AQS 的内部类,实现了 Condition 接口。Condition 的 await() 方法会使线程进入等待队列,并释放锁,线程状态变为等待状态。addConditionWaiter() 方法将线程创建节点放入等待队列,同步队列的首节点移动到等待队列。通知调用 Condition 的 signal() 方法,可以唤醒等待队列的首节点,唤醒之前会将该节点移动到同步队列中。signalAll() 方法使用 do-while 循环将等待队列中的全部节点移动到同步队列中,并唤醒每个节点的线程。整个过程分为三步:线程获取锁后,通过调用 Condition 的 await() 方法加入等待队列并释放锁;当线程调用 signal() 方法后,程序通过 doSignal(Node first) 方法将节点移动到同步队列,并唤醒节点中的线程;被唤醒的线程退出 await() 方法,继续执行。