讲师中心 微信公众号
AI工具推荐 视频效率加速

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

陌明酱_9635

陌明酱_9635

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

|

435人浏览过

|

来源于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+ 中确实用了 takeLock 和 putLock 两把锁,理论上允许生产和消费并行。但实际中,若存在频繁 remove()、contains() 或遍历操作,它反而要同时抢两把锁,比 ArrayBlockingQueue 的单锁更慢。

  • remove(Object o) 在 LinkedBlockingQueue 中需先加 putLock 再加 takeLock,锁竞争剧烈
  • ArrayBlockingQueue 的数组结构支持 O(1) 定位 takeIndex 和 putIndex,缓存友好,在 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工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
string转int
string转int

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

6799

2023.08.02

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

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

6247

2023.07.18

堆和栈区别
堆和栈区别

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

2628

2023.08.10

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

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

4438

2023.08.10

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

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

902

2023.08.14

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

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

2727

2023.08.22

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

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

5357

2023.09.19

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

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

705

2023.10.18

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn