写点什么

Java 并发包源码学习系列:LBD 双端阻塞队列源码解析,linux 内核架构与底层原理

作者:Java高工P7
  • 2021 年 11 月 10 日
  • 本文字数:1110 字

    阅读完需:约 4 分钟

*/


transient Node<E> first;


/**


  • 指向最后一个节点

  • Invariant: (first == null && last == 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.newCondition();


}


linkFirst


=============


尝试将节点加入到 first 之前,更新 first,如果插入之后超出容量,返回 false。


private boolean linkFirst(Node<E> node) {


// assert lock.isHeldByCurrentThread();


if (count >= capacity)


return false;


Node<E> f = first;


node.next = f;


first = node;


if (last == null)


last = node;


else


f.prev = node;


++count;


notEmpty.signal();


return true;


}



linkLast


============


在 last 节点后加入节点 node,更新 last。如果插入之后超出容量,返回 false。


private boolean linkLast(Node<E> node) {


// assert lock.isHeldByCurrentThread();


if (count >= capacity)


return false;


Node<E> l = last;


node.prev = l;


last = node;


if (first == null)


first = node;


else


l.next = node;


++count;


notEmpty.signal();// 满足 notEmpty 条件


return true;


}



unlinkFirst


===============


移除 first 节点,并返回其 item 值,如果队列为空,则返回 full。


private E unlinkFirst() {


// assert 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;


else


n.prev = null;


--count;


notFull.signal();// 满足 notFull 条件


return item;


}



unlinkLast


==============


移除 last 节点,并返回其 item 值,如果队列为空,则返回 full。


private E unlinkLast() {


// assert lock.isHeldByCurrentThread();


Node<E> l = last;


if (l == null)


retur


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


n 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;


else


p.next = null;


--count;


notFull.signal(); // 满足 notFull 条件


return item;


}



unlink


==========


移除任意一个节点,注意这里并没有操作 x 本身的连接,因为它可能仍被 iterator 使用着。


void unlink(Node<E> x) {


// assert lock.isHeldByCurrentThread();


Node<E> p = x.prev;


Node<E> n = x.next;


// 移除的是 first


if (p == null) {


unlinkFirst();


// 移除的是 last

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Java并发包源码学习系列:LBD双端阻塞队列源码解析,linux内核架构与底层原理