当前位置: 首页 > news >正文

线程池阻塞队列的选择

一、背景
想起前两年被问到阻塞队列怎么选,有界是必然的, ArrayBlockingQueue、LinkedBlockingQueue怎么选呢。
二、打开源码看看

        ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(3);LinkedBlockingQueue linkedBlockingQueue = new LinkedBlockingQueue(3);arrayBlockingQueue.put(1);arrayBlockingQueue.take();linkedBlockingQueue.put(1);linkedBlockingQueue.take();

点击方法发现第一个用一个锁,第二两个锁

    //LinkedBlockingQueue private final ReentrantLock takeLock = new ReentrantLock();private final ReentrantLock putLock = new ReentrantLock();

得出结论,第二个吞吐量高,因为进队列和出队列相互没影响。
三、知识拓展
1、阻塞队列是怎么阻塞住呢?比如队列满了还往里面放是咋处理的?

while (count.get() == capacity) {notFull.await();}

notFull.await();会将当前线程放到Condition等待队列中
其实用的还是下列的方法

LockSupport.park(this);

在出队列中必然有一个 LockSupport.unpark(node.thread);

 notEmpty.signal();//一直点点LockSupport.unpark(node.thread);

2、遇到一个关键字volatile
新开一个文章吧

http://www.lryc.cn/news/335793.html

相关文章:

  • linux内核驱动-在内核代码里添加设备结点
  • 【算法优选】 动态规划之简单多状态dp问题——贰
  • 【算法刷题 | 二叉树 06】4.10( 路径总和、路径总和 || )
  • 代码学习记录37----动态规划
  • Spring Boot:Web开发之三大组件的整合
  • 2024.3.15力扣每日一题——卖木头块
  • vue快速入门(七)内联语句
  • Docker实战教程 第2章 Docker基础
  • 【S32K3 MCAL配置】-3.2-CANFD配置-发送“经典CAN/CANFD标准帧“和“经典CAN/CANFD扩展帧“(基于MCAL+FreeRTOS)
  • 【airtest】自动化入门教程(四)Poco元素定位
  • Go语言中如何处理goroutine和循环变量
  • Pytest教程:一文了解如何使用 pytest_runtest_makereport 修改 Pytest 测试报告内容
  • 《高通量测序技术》分享,生物信息学生信流程的性能验证,以肿瘤NGS基因检测为例。
  • Django+Celery框架自动化定时任务开发
  • 解决element-plus table组件 fixed=“right“(left)浮动后横向滚动文字穿透的问题
  • 【opencv】示例-distrans.cpp 距离变换
  • LVGL V8 代码细读——极致的链表使用
  • 蓝桥杯第十二届c++大学B组详解
  • Tubi 十岁啦!
  • Qt C++ 实现文件监视源码
  • 蓝桥杯第十一届c++大学B组详解
  • 大模型日报2024-04-10
  • redis修改协议改了,有哪些替代品?
  • 《QT实用小工具·十六》IP地址输入框控件
  • windows 系统下 mysql 数据库的下载与安装(包括升级安装)
  • Redis Stack十部曲之三:理解Redis Stack中的数据类型
  • OneForAll安装使用
  • 【现代C++】线程支持库
  • 游戏引擎架构01__引擎架构图
  • [Java、Android面试]_15_Android为什么使用Binder?