linkedblockingdeque是由链表构成的界限可选的双端阻塞队列,支持o(1)的油性头发时间复杂度从两端插入和移除元素,如不指定边界,则为integer.max_value。
由一个reentrantlock保证同步,使用conditions来实现等待通知。
public class linkedblockingdeque<e> extends abstractqueue<e> implements blockingdeque<e>, java.io.rializable { private static final long rialversionuid = -387911632671998426l; /** 双向链表节点 */ static final class node<e> { e item; node<e> prev; node<e> next; node(e x) { item = x; } } /** * 指向第一个节点 * invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */ transient node<e> first; /** * 指向最后一个节点 * invariant: (first == null && last == null) || * (last.next == null && last.item != null) */ transient node<e> last; /** 节点数量 */ private transient int count; /** 队列容量 */ private final int capacity; /** 保证同步 */ final reentrantlock lock = new reentrantlock(); /** take操作发生的条件 */ private final condition notempty = lock.newcondition(); /** put操作发生的条件 */ private final condition notfull = lock.newcondi抽检是什么意思tion(); }
尝试将节点加入失恋三十天到first之前,更新first,如果插入之后超出容量,返回fal。
防辐射服十大品牌private boolean linkfirst(node<e> node) { // asrt lock.isheldbycurrentthread(); if (count >= capacity) return fal; node<e> f = first; node.next = f; first = node; if (last == null) last = node; el f.prev = node; ++count; notempty.signal(); return true; }
在last节点后加入节点node,更新last。如果插入之后超出容量,返回fal。
private boolean linklast(node<e> node) { // asrt lock.isheldbycurrentthread(); if (count >= capacity) return fal; node<e> l = last; node.prev = l; last = node; if (first == null) first = node; el l.next = node; ++count; notempty.signal();// 满足notempty条件 return true; }
移除first节点,并返回其item值,如果队列为空,则返回full。
private e unlinkfirst() { // asrt lock.isheldbycurrentthread(); node<e> f = first; if (f == null) return null; node<e> n = f.next; e item = f.item; f.item = null; f.next = f; // help gc first = n; if (n == null) last = null; el n.prev = null; --count; notfull.signal();// 满足notfull条件 return item; }
移除last节点,并返回其item值,如果队列为空,则返回full。
private e unlinklast() { // asrt lock.isheldbycurrentthread(); node<e> l = last; if (l == null) return null; node<e> p = l.prev; e item = l.item; l.item = null; l.prev = l; // help gc last = p; if (p == null) first = null; el p.next = null; --count; notfull.signal(); // 满足notfull条件 return item; }
移除任意一个节点,注意这里并没有操作x本身的连接,因为它可能仍被iterator使用着。
void unlink(node<e> x) { // asrt lock.isheldbycurrentthread(); node<e> p = x.prev; node<e> n = x.next; // 移除的是first if (p == null) { unlinkfirst(); // 移除的是last } el if (n == null) { unlinklast西安外国语大学排名(); } el { // 移除的是中间节点 p.next = n; n.prev = p; x.item = null; // don't mess with x's links. they may still be in u by // an iterator. // 这里x的prev和next指针都没有改变,因为他们可能在被iterator使用 --count; notfull.signal(); } }
linkedblockingdeque是由链表构成的界限可选的双端阻塞队列,支持o(1)的时间复杂度从两端插入和移除元素,如不指定边界,则为integer.max_value。
由一个reentrantlock保证同步,使用conditions来实现等待通知。
上面介绍的所有操作基本上就是核心方法啦,诸如putfirst、putlast、takefirst、takelast等方法都会调用上面的核心方法,而且实现上面也是比较简单的,就是双端链表的基本操作,不懂的可以画画图帮助理解哈。
本文发布于:2023-04-05 02:44:04,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/a0330bb74d3f55548dabed55bfae1de3.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:java双端队列作用(java三种队列详解).doc
本文 PDF 下载地址:java双端队列作用(java三种队列详解).pdf
留言与评论(共有 0 条评论) |