当前位置: 首页 > 网络应用技术

LinkedBlockingqueue

时间:2023-03-07 02:35:25 网络应用技术

  LinkedBlockingQueue来自JDK1.5的JUC包。这是一个有限的阻止队列,支持并发操作。基础数据结构是单个链列表。

  作为一个有限的队列,容量范围为[1,integer.max_value],可以指定容量。如果未指定容量,则默认容量等于Integer.max_value,即最大容量。

  由于消费者线程仅操作团队,因此生产线程仅运行团队的尽头。在这里,我们使用两个锁。Putlock用于插入数据。生产线和消费者线程竞争的现象(例如ArrayBlockingQueue仅使用一个锁),因此LinkedBlockingQueue比ArrayBlockingQueue好得多,但是有必要穿越整个排队。清除并包含操作)。

  LinkedBlockingQueue的工作模式是非fair的,不能手动指定为公平模式,即获得锁的实际线程顺序无法保证它正在等待锁的线程顺序。

  实现可序列化的接口,支持序列化,不实现可克隆,并且不支持克隆!

  没有空元素!

  由于链接的列表结构用于保存数据,因此引用了头部和末端节点和最后一个节点。链接列表节点类型是内部类型节点类型。由于它是有限的队列,容量变量用于保存,容量是INT类型,因此LinkedBlockingqueue的最大容量是Integer.max_value.max_value.use a iatomicInteger类型的类型的类型原子变量算作计数器,即螺纹-Safe。

  有两个Takelock的锁,Putlock,Takelock作为消费者线获得的锁,对于消费者线程的阻塞和唤醒,有一个相应的无空条件变量。生产线的阻塞和唤醒!

  在构造函数中,LinkedBlockingqueue的内部线将简单地初始化,即,头节点指向具有相同值null的哨兵节点。

  创建一个具有Integer.max_value容量的LinkedBlockingqueue。

  创建一个具有指定容量的LinkedBlockingqueue。如果容量小于1,则投掷IllegalargumentException。

  创建Integer.max_value的linkedblockingqueue,其中包含指定集的所有元素,并按照集合Theerator的遍历添加元素。

  如果指定的集合为或任何元素为null,请投掷NullPoInterException。如果设置元素的数量超过Integer.max_value,则扔IllegalStateException。

  将指定元素插入队列的尾部。如果队列已满,则线程正在等待。

  如果您没有锁定在同步队列中时被中断,因为您没有锁定在同步队列中,则抛出了中断的exception,也就是说,响应被中断。它因中断而被唤醒,并且也将被抛弃。此外,如果指定的元素为null,则将nullPoInterException异常抛出。在arrayblockingqueue,当生产(放入数据)线程阻止,消耗(删除数据)线程以唤醒时,并且因为它们获得相同的锁定,消耗量,消耗和消费,并且无法执行生产(假设线程仅参与工作的生产或消费消费源)。

  在LinkedBlockingqueue中,如果由于未获得线程或队列已满,因此线程被生产(放入数据)线程阻止(放入数据),则可以在以后的消费者线程中唤醒他,或者可能会被以后的生产线程唤醒。因为它内部有两个锁,所以生产和消费获得了不同的锁,可以并行执行生产和消费任务。它不仅会在消费数据期间唤醒阻塞性生产线,还会唤醒先前被阻塞的生产线以继续生产。

  可能是:

  /**

  /**

  公共布尔报价(E E)

  与报价方法相比,如果您在同步队列中等待,因为您无法获得锁,则在被中断时,您将继续等待锁null,将nullpoInterException投掷。

  另外,这里的“不阻止”意味着如果队列在获得锁后已满,它将立即返回false而不会阻止条件队列!报价方法仍将在锁的同步队列中被阻止,因为它们无法获得锁!

  将指定元素插入该队列的尾部。如果队列已满,请在达到指定的等待时间之前等待。如果插入成功插入,则返回true;如果在使用空间之前可以超越等待时间,则将返回错误。

  如果您没有锁定在同步队列中时被中断,因为您没有锁定在同步队列中,则抛出了中断的exception,也就是说,响应被中断。它因中断而被唤醒,并且也将被抛弃。另外,如果指定的元素e为null,则将抛出NullPointTerException。

  将指定元素插入此队列。成功时返回。如果目前尚无可用空间,请进行IllegalStateException。如果e元素为null,则抛出nullPoInterException。当使用具有容量的队列时,通常首选要约。

  如果您在同步队列中被中断,因为您没有锁定锁,则在被中断时,您将继续等待锁,也就是说,不要响应中断。被扔了。

  在元素可用之前,要等待并删除该队列的头部(队列不是空的)。

  在元素可用之前,要等待并删除该队列的头部(队列不是空的)。

  如果您没有锁定在同步队列中时被中断,因为您没有锁定在同步队列中,则抛出了中断的exception,也就是说,响应被中断。它因中断而被唤醒,并且也将被抛弃。

  在ArrayBlockingQueue中,当消耗(删除数据)线程被阻塞时,生产(放入数据)线程唤醒,并且由于它们获得相同的锁定,因此无法执行相同的锁定(假设线程仅参与生产,或工作的消耗消耗器)。在LinkedBlockingqueue中,如果该线程被消费者(删除的数据)线程阻止,因为线程无法获得消费者锁或队列为空,则可能会被后来的生产线程或Wake唤醒他稍后由消费者线程进行。由于里面有两个锁,生产和消费获得了不同的锁,可以并行执行生产和消费任务。它不仅会在生产数据期间唤醒阻塞性消费者线程。它将唤醒在继续消费之前被阻止的消费者线程。

  可能是:

  Dequeue删除头节点dequeue方法以删除头节点并返回项目值。

  在LinkedBlockingqueue中,头部指向的节点是一个哨兵节点,而头部的后继可能是真正的头节点。

  因此,在dequeue中,卸下的头节点是要获得头部作为新的头部,保存项目值并将项目引用到null。原始头点指向您自己,为什么不指向null?因为linkedblockingqueue,下一个节点为null,然后意味着它将用于队列的末端。这将在迭代器时使用,如果您指出自己,则可以显示队列。迭代器将在后面提及!

  获取并卸下此队列的头部。如果此队列为空,请直接返回null。

  与“采用方法相比空,它将直接返回零,而无需阻止等待。

  获取并卸下此队列的头,在指定的等待时间之前等待可用元素(如有必要)。返回该队列的头;如果元素在使用前可以超过指定的等待时间,请返回null。

  如果您没有锁定在同步队列中时被中断,因为您没有锁定在同步队列中,则抛出了中断的exception,也就是说,响应被中断。它因中断而被唤醒,并且也将被抛弃。

  获取并删除此队列的头部。此方法之间的唯一区别是,该队列是在空空白时抛出鼻nosuchelementException Anomalies。

  与采用方法相比,如果您在同步队列中等待,因为您无法获得锁,则在被中断时,您将继续等待锁,也就是说,不会响应中断。

  内部实际上称为民意测验方法。确定是否需要根据民意测验方法的返回值提出异常!

  从该队列中,删除指定元素的单个实例(如果您存在)。如果删除成功,请返回true;如果没有指定的元素或指定的元素为null,则返回false。

  从队列头到穿越队列,查找并指定元素o使用等于比较真实元素P,然后调用UNLINK删除P节点。此方法需要同时获得两个锁。性能很差。通常,不建议使用它!

  UNLINK删除了指定的节点UNINK方法以删除指定的节点P查询。该方法相对简单,即P的前轮驱动到P的后继产品,但后来,P的成功并未放置为null。为什么?它与Dequeue一样,因为指向Null表示它已经穿过队列的尽头,并且只有从队列中的头节点才能指向自己。下一个点没有更改为使用迭代器。将提及设备零件!

  在不移动队列的情况下获取队列的头;如果此队列为空,请返回null。

  2.5.2元素()方法公共元素()

  获取此队列的头。此方法和窥视之间的唯一区别在于,该队列在空的时会引发异常。

  返回此queue.com中的元素数量,并包含大多数其他元素,例如consurrentlinkedqueue,此方法返回原子变量的最新值,并且团队的操作被锁定,因此返回了准确的值!

  如果此队列不包含元素,则返回true。

  公共迭代器迭代器()返回迭代器迭代器中的迭代器中的迭代器中的队列中的迭代器。就像其他容器一样,返回的迭代器是“弱”的,不会抛出conturrentModification exception,它支持并发修改,但不能保证迭代元素的元素此时!

  以下源代码分析包括迭代器的方法,实际上非常简单。一致性弱的原则在注释中也清楚地谈到了它。下一次的实际值是在最后一次迭代中确定的。使用CurrentElementsave,等效于值的值,弱的一致性显而易见!

  此外,当您在NextNode方法中获得下一个迭代的下一个有效节点时,我们将判断我们前面提到的两个删除节点:

  LinkedBlockingQueue和ArrayBlockingQueue是两个常用的阻塞队列。他们有许多相似之处和差异:

  原始:https://juejin.cn/post/7100115962875084808