0

0

ArrayBlockingQueue与LinkedBlockingQueue对比_有界与无界的选型

P粉602998670

P粉602998670

发布时间:2026-02-26 05:41:34

|

355人浏览过

|

来源于php中文网

原创

arrayblockingqueue 和 linkedblockingqueue 的选择需综合容量控制、内存开销、锁机制、gc 压力及时序要求:前者容量强制、内存紧凑、单锁可控,适合高吞吐与资源受限场景;后者默认“伪无界”易致 oom,双锁在频繁中间操作时反而更慢,且节点开销大、gc 压力高。

arrayblockingqueue与linkedblockingqueue对比_有界与无界的选型

有界队列必须显式指定 capacity,否则编译不报错但运行时会出问题

ArrayBlockingQueue 在构造时 capacity 是强制参数,不传直接编译失败;而 LinkedBlockingQueue 的 capacity 是可选的——不传就默认用 Integer.MAX_VALUE(≈21亿),表面“无界”,实则极易掩盖内存泄漏或背压失控问题。

  • 线上曾有服务因误用无参 new LinkedBlockingQueue(),突发流量把堆撑爆 OOM,GC 频繁但找不到明显大对象
  • ArrayBlockingQueue 一旦容量设小(比如 new ArrayBlockingQueue(10)),生产者调用 put() 会立刻阻塞,能天然暴露吞吐瓶颈
  • 如果真需要“逻辑无界”,建议显式写成 new LinkedBlockingQueue(Integer.MAX_VALUE),至少让容量意图可见

高并发读写分离场景下,LinkedBlockingQueue 的双锁机制未必更快

LinkedBlockingQueue 在 JDK 8+ 中确实用了 takeLockputLock 两把锁,理论上允许生产和消费并行。但实际中,若存在频繁 remove()contains() 或遍历操作,它反而要同时抢两把锁,比 ArrayBlockingQueue 的单锁更慢。

Dify AI
Dify AI

开源的大语言模型(LLM) 应用开发平台

下载
  • remove(Object o) 在 LinkedBlockingQueue 中需先加 putLock 再加 takeLock,锁竞争剧烈
  • ArrayBlockingQueue 的数组结构支持 O(1) 定位 takeIndexputIndex,缓存友好,在 CPU 密集型场景吞吐更稳
  • 除非你的典型负载是「持续大批量入队 + 持续大批量出队」且几乎不用中间操作,否则别迷信“双锁=高性能”

内存占用和 GC 压力差异远比想象中大

ArrayBlockingQueue 用一个连续数组,对象头 + 数组本身,内存紧凑;LinkedBlockingQueue 每个元素都包装成 Node 对象(含 item + next 引用),哪怕只存 Integer,也要多分配 24~32 字节(取决于 JVM 布局)。

  • 存 10 万个 String,LinkedBlockingQueue 多产生约 2~3MB 额外对象,GC 频率明显上升
  • ArrayBlockingQueue 的数组扩容不可行,但好处是内存始终可控;LinkedBlockingQueue 表面灵活,却把压力转嫁给 GC
  • Android 或资源受限环境,优先选 ArrayBlockingQueue —— 链表节点碎片化对低内存设备更不友好

公平性与线程唤醒顺序影响任务时效性

两者都支持构造时传 fair = true,但行为不同:ArrayBlockingQueue 的公平锁会让等待最久的线程优先获取锁;而 LinkedBlockingQueue 的 notEmpty/notFull 条件队列在公平模式下,唤醒顺序才真正按 FIFO 排。

  • 秒杀场景中,若用非公平 ArrayBlockingQueue,后到的请求可能插队成功,导致先排队的用户超时失败
  • 但开启公平模式会降低吞吐——JVM 要维护线程等待队列,每次唤醒都要遍历
  • 真正对时序敏感的业务(如订单超时取消),别只依赖队列公平性,应在业务层加时间戳+优先级判断
ArrayBlockingQueue 和 LinkedBlockingQueue 看似只是“数组 vs 链表”的选择,实际牵扯的是容量预期、GC 敏感度、锁竞争模式和时序控制粒度——这些点一旦在线上跑起来,改起来成本远高于初始化那一行 new。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

424

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

597

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

720

2023.08.10

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

326

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

1795

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2105

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

283

2023.10.18

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

127

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号