Java并发包源码学习系列:LBD双端阻塞队列源码解析
尝试将节点加入到first之前,更新first,如果插入之后超出容量,返回false。
private boolean linkFirst(Node node) {
// assert lock.isHeldByCurrentThread();
if (count >= capacity)
return false;
Node 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 node) {
// assert lock.isHeldByCurrentThread();
if (count >= capacity)
return false;
Node 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 f = first;
if (f == null)
return null;
Node 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 l = last;
if (l == null)
return null;
Node 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 x) {
// assert lock.isHeldByCurrentThread();
Node p = x.prev;
Node n = x.next;
// 移除的是first
if (p == null) {
unlinkFirst();
// 移除的是last
} else if (n == null) {
unlinkLast();
} else {
// 移除的是中间节点
p.next = n;
n.prev = p;
x.item = null;
// Don’t mess with x’s links. They may still be in use by
// an iterator.
Java并发包源码学习系列:LBD双端阻塞队列源码解析相关推荐
- Java并发包源码学习系列:同步组件CountDownLatch源码解析
文章目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void ...
- SpringBoot源码学习系列之异常处理自动配置
SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...
- java毕业生设计在线多媒体学习社区的设计与实现计算机源码+系统+mysql+调试部署+lw
java毕业生设计在线多媒体学习社区的设计与实现计算机源码+系统+mysql+调试部署+lw java毕业生设计在线多媒体学习社区的设计与实现计算机源码+系统+mysql+调试部署+lw 本源码技术栈 ...
- PyTorch源码学习系列 - 1.初识
本系列文章会优先发布于微信公众号和知乎,欢迎大家关注 微信公众号:小飞怪兽屋 知乎: PyTorch源码学习系列 - 1.初识 - 知乎 (zhihu.com) 目录 本系列的目的 PyTorch是什 ...
- Netty源码分析系列之服务端Channel的端口绑定
扫描下方二维码或者微信搜索公众号菜鸟飞呀飞,即可关注微信公众号,Spring源码分析和Java并发编程文章. 微信公众号 问题 本文内容是接着前两篇文章写的,有兴趣的朋友可以先去阅读下两篇文章: Ne ...
- cocos2dx+JAVA手游《全民挂机》全套源码支持安卓+IOS双端
cocos2dx+JAVA手游<全民挂机>全套源码支持安卓+IOS双端,客户端用cocos2dx 2.2.3实现,服务端用java,支持安卓+IOS双端,一款很不错的挂机游戏源码! 源码下 ...
- 并发编程5:Java 阻塞队列源码分析(下)
上一篇 并发编程4:Java 阻塞队列源码分析(上) 我们了解了 ArrayBlockingQueue, LinkedBlockingQueue 和 PriorityBlockingQueue,这篇文 ...
- java计算机毕业设计高校多媒体设备运维管理系统服务端(附源码、数据库)
java计算机毕业设计高校多媒体设备运维管理系统服务端(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...
- Android音视频学习系列(九) — Android端实现rtmp推流
系列文章 Android音视频学习系列(一) - JNI从入门到精通 Android音视频学习系列(二) - 交叉编译动态库.静态库的入门 Android音视频学习系列(三) - Shell脚本入门 ...
最新文章
- mysql 十万条 输出_MySQL一次性插入十万条数据
- 独家 | 自动机器学习:团队如何在自动学习项目中一起工作?(附链接)
- 你朋友圈里的广告是怎么做到合你胃口的?
- 两个数据库表同步的可视化WEB同步程序
- 《无人机DIY》——导读
- signature=32c56289e10e63e51063305adfc34ef0,Deconfinement transition and Black Holes
- Qt qlabel 设置字体、大小、加粗等
- 笔记本计算机被限制无法上网,电脑上网受限制或无法连接怎么办 电脑上网受限制或无法连接的解决方法...
- 如何对接线上支付接口
- Python 爬取小说点评网站,用大数据方法找小说
- Linux下查看电脑配置信息
- swiper 滑动图片垂直居中
- Deep Attention Recurrent Q-network(DRAQN)论文笔记
- jmeter压测生成报告
- 多伦多大学计算机ib成绩要求,QS世界Top30大学 A-level及IB 成绩详细要求!
- clap与slap_clap什么意思(slap与clap的区别)
- vue中使用Luckysheet实现Excel的导入、在线编辑、导出等功能
- magento2 邮件模板中直接调用 block文件
- android实现手机端控制电脑PPT播放的APP(一)
- 后端 绘制有向无环图(DAG图)
热门文章
- Promise实现一个红绿灯
- antd modal 拖动_Package - antd-draggable-modal
- 【韩老师零基础30天学会Java 09】Math Arrays 数组拷贝 自然排序 System BigDecimal 银行家算法舍入 日期类LocalDateTime转换 String翻转
- LVS-DR模式单网段和多网段设置步骤
- Java基于springboot开发的党员党务管理系统(主要侧重于开会流程)
- HTML5+CSS3基础(day6)
- Android View体系(2)
- Geotools与OGC(三)----WKB几何信息读取
- 说话人识别/声纹识别学习路径的资料整理,从零学声纹识别
- WSL2安装及其python环境配置