今天引入的条件可能会在业务开发中使用较少使用,通常在框架或中间件中更常见。本文用于Java的ArrayBlockingqueue中的条件和实现原理。
ArrayBlockingQueue构造函数,这两个条件都是由reentrantlock的NewConditon方法构建的条件对象。
通过查看Reentrantlock的新调节方法,您可以看到实际条件实现类是条件对象。这是今天要分析的关键对象。
ArrayBlockingQueue的使用和不发光的使用如下1 notfull。如果队列已满,则执行notifull.await以使线程等待。当消息队列为空时,如果队列为空,则执行notempty.await。元素消费者消息结束后,标志性的。信号觉醒的生产者线程到队列发布元素。
在下面,我们关注条件对象中如何实现等待和信号。
主要步骤:1。创建一个新建造的等待节点以加入条件。4.如果CLH的等待队列,请通过CLH队列锁定。5。如果NextWaiter的节点不是空的,则意味着有一个新的Condtion等待节点,则是Conditon Unirectirectional directional queue movesexcept的节点取消状态6.确定是否需要中断或抛出异常
如果最后一个等待状态不是节点。条件,您需要从等待队列中删除被取消的节点,然后创建一个节点。参数中线是当前线程。
完成释放锁的操作后,可以从中可以看出,等待操作的执行将释放锁。首先,获取状态的状态值,然后将其重置为0。在锁定之前返回状态的值。如果失败,节点的waitstatus状态是已取消的状态
等待队列中的节点为锁定而战,以前已经在reentrantlock中进行了分析,因此我不会在这里详细介绍。
条件摩托车的信号唤醒第一任领域(即条件等待队列中的第一个节点)
Dosignal开始从第一任Waiter循环唤醒尚未取消的第一个等待节点
TransferforSignal是将等待节点的候补重置为0,然后将两个末端等待队列从条件队列转移到CLH。
下图显示,从条件的等待队列中,它将转移到CLH等待队列。
今天引入的孔子对象主要是有条件的等待队列。您可以创建多个条件等待队列。Reentrantlock是仅有CLH的两条路线队列。它正在等待两个路队。相反