Java并发包中的PriorityBlockingQueue解析

PriorityBlockingQueue<E>是 Java 并发包(java.util.concurrent)中提供的一个线程安全的、无界、优先级队列。它的核心思想是:

每次取出的元素,都是当前队列中“优先级最高”的那个元素(即最小值,依据自然排序或自定义比较器)。


一、关键特性总结

特性说明
线程安全所有公共操作都通过ReentrantLock加锁,支持多线程并发访问。
无界(逻辑上)理论上可以无限添加元素(但受 JVM 内存限制,可能抛OutOfMemoryError)。
不允许 null 元素插入null会抛NullPointerException
基于堆(Heap)实现底层使用数组表示的二叉堆(最小堆),保证queue[0]是优先级最高的元素。
阻塞式取操作提供take()poll(timeout)等方法,在队列为空时可阻塞等待。
不保证迭代顺序iterator()不按优先级顺序遍历!如需有序,必须用Arrays.sort(toArray())
插入/删除时间复杂度O(log n),因为要维护堆结构。

二、核心机制解析

1.底层数据结构:二叉最小堆

  • 使用Object[] queue存储元素。
  • 对于任意节点i
    • 左孩子:2*i + 1
    • 右孩子:2*i + 2
    • 父节点:(i - 1) / 2
  • 堆性质:父节点 ≤ 子节点→ 根节点(queue[0])是最小值(最高优先级)。

2.扩容机制(tryGrow)

  • 当数组满时,自动扩容:
    • 小容量(<64):增长较快(+ oldCap + 2)
    • 大容量:增长 50%(oldCap >> 1)
  • 特殊设计:扩容时不持有主锁(lock),而是用CAS 自旋锁allocationSpinLock)避免阻塞消费者。
    • 目的:防止生产者扩容时长时间持有锁,导致消费者“饿死”。

3.堆调整操作

  • siftUp:插入新元素后,从底部向上调整(冒泡到合适位置)。
  • siftDown:删除根节点后,把最后一个元素放到根,再向下调整。
  • 分为两种版本:
    • siftUpComparable/siftDownComparable:使用元素自身的compareTo()
    • siftUpUsingComparator/siftDownUsingComparator:使用外部Comparator

4.构造函数逻辑

  • 如果传入的是SortedSetPriorityQueue,直接复用其排序规则(无需重新建堆)。
  • 否则,对传入集合调用heapify()从底向上建堆(时间复杂度 O(n))。

5.阻塞与非阻塞操作

方法行为
offer(e)立即插入,返回true(永不阻塞,因无界)
put(e)offer,语义上“可能阻塞”,但实际不会
take()队列空时阻塞,直到有元素
poll()队列空时立即返回 null
poll(timeout, unit)队列空时最多等待 timeout 时间

6.关于迭代器(重要!)

Iterator<E>it=pq.iterator();// ❌ 不保证按优先级顺序遍历!
  • 原因:堆的数组存储不是排序数组,只是满足堆性质。
  • 正确做法:如需有序遍历,必须:
    Object[]arr=pq.toArray();Arrays.sort(arr);// 或使用 Comparator

三、FIFOEntry 示例:解决“优先级相同时的公平性”

当多个元素优先级相同(compareTo == 0),默认不保证谁先出队。

解决方案:引入“插入顺序”作为第二排序键。

classFIFOEntry<EextendsComparable<?superE>>implementsComparable<FIFOEntry<E>>{staticfinalAtomicLongseq=newAtomicLong(0);finallongseqNum;// 插入序号finalEentry;publicintcompareTo(FIFOEntry<E>other){intres=entry.compareTo(other.entry);if(res==0)res=Long.compare(seqNum,other.seqNum);// 先插入的先出returnres;}}

使用时:pq.offer(new FIFOEntry(myElement));


四、典型使用场景

  • 任务调度系统:高优先级任务先执行。
  • 事件处理:紧急事件优先处理。
  • 合并多个有序流:如多路归并(配合take()阻塞特性)。

五、注意事项

  1. 不要依赖iterator()的顺序
  2. 避免在比较器中抛异常:会导致队列状态不一致。
  3. 内存风险:虽然是“无界”,但大量积压会导致 OOM。
  4. 性能:高并发下,所有操作串行化(单锁),吞吐量不如ConcurrentLinkedQueue,但语义不同。

总结

PriorityBlockingQueue=线程安全的 PriorityQueue + BlockingQueue 接口
它适合需要按优先级消费、且允许多线程协作的场景,但要注意其无界性迭代无序性

如果你理解了二叉堆、CAS 自旋锁、以及阻塞条件(Condition notEmpty),就掌握了它的精髓。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开题报告 “卡壳” VS “开挂”?虎贲等考 AI 让学术起点赢在合规

学术研究的第一步&#xff0c;往往卡在开题报告&#xff1a;选题要么 “大到无从下手”&#xff0c;要么 “小到无研究价值”&#xff1b;文献综述堆砌资料却无逻辑&#xff0c;技术路线图混乱到导师看不懂&#xff1b;格式反复修改仍不达标&#xff0c;查重风险如影随形。而虎…

AI 技术在CRM 系统中的应用

AI 技术已经从 CRM 系统&#xff08;客户关系管理&#xff09;的“插件”进化为了其核心引擎。现代 CRM 不再只是一个存储客户资料的静态数据库&#xff0c;而是一个能够主动思考、预测并执行任务的“智能助手”。以下是 AI 技术在CRM 系统中的核心应用场景&#xff1a;1. 销售…

学长亲荐MBA必看TOP8AI论文平台测评

学长亲荐MBA必看TOP8AI论文平台测评 学术AI工具测评&#xff1a;为何需要一份精准指南 在MBA学习与研究过程中&#xff0c;论文写作是一项核心任务&#xff0c;而随着AI技术的普及&#xff0c;各类学术辅助工具层出不穷。然而&#xff0c;面对众多选择&#xff0c;如何快速找到…

51405098-100 逻辑控制器模块

HONEYWELL 51405098-100 逻辑控制器模块概述该模块属于 Honeywell 的工业自动化控制器系列&#xff0c;用于对复杂的控制逻辑进行集中处理和管理。它通过逻辑运算和程序执行来控制生产或工业流程中的各类设备。主要功能逻辑控制&#xff1a;支持基本的 AND、OR、NOT 等逻辑运算…

2026年知名的智慧农业四情监测,农业四情监测管理系统,农业四情监测站厂家选购参考名录 - 品牌鉴赏师

引言在 2026 年,智慧农业四情监测、农业四情监测管理系统以及农业四情监测站在农业现代化进程中愈发重要,其市场规模不断扩大,众多厂家纷纷涌入该领域。为了给广大农业从业者、相关企业以及投资者在选购合适的农业四…

AI 写论文哪个软件最好?深挖内核:虎贲等考 AI 凭 “学术三重门” 碾压同类

毕业季 AI 论文工具乱象丛生&#xff0c;有的主打 “快速生成” 却牺牲专业度&#xff0c;有的宣称 “全流程覆盖” 却功能碎片化。到底 AI 写论文哪个软件最好&#xff1f;抛开表面宣传&#xff0c;我们从学术核心需求出发&#xff0c;深度拆解虎贲等考 AI&#xff08;官网&am…

AI 写论文哪个软件最好?实测认证!虎贲等考 AI 凭 “学术闭环” 成终极答案

毕业季的论文创作&#xff0c;一半是研究本身的深耕&#xff0c;一半是工具选择的博弈 —— 有的 AI 软件只懂文字拼接&#xff0c;文献引用虚假&#xff1b;有的侧重格式排版&#xff0c;却缺乏实证支撑&#xff1b;还有的 AI 痕迹浓重&#xff0c;查重易触发预警。到底哪款 A…

2025年值得信赖的汽车托运物流公司TOP榜出炉!成都汽车托运物流精选优质品牌助力工程采购 - 品牌推荐师

随着汽车消费市场的持续活跃与跨区域流动的日益频繁,汽车托运物流行业正迎来新一轮的发展机遇。面对市场上众多的服务商,消费者如何选择一家安全、高效、透明的托运公司,成为普遍关注的焦点。基于对市场公开数据、用…

Go sync包并发原语详解

前言 Go的goroutine和channel解决了大部分并发问题&#xff0c;但有些场景下&#xff0c;sync包提供的原语更简洁高效。比如保护共享变量、等待一组goroutine完成、确保初始化只执行一次等。 本文整理sync包中常用类型的使用方法和注意事项&#xff0c;配合实际代码示例。1. Mu…

虎贲等考 AI:重新定义学术创作,全流程智能辅助工具

在学术探索的道路上&#xff0c;论文写作往往伴随着选题迷茫、文献繁杂、数据缺失、格式混乱等诸多难题。虎贲等考 AI 智能写作平台&#xff08;官网&#xff1a;https://www.aihbdk.com/&#xff09;应势而生&#xff0c;作为一款基于前沿人工智能技术打造的专业论文写作辅助工…

2026年诚信的郑州五金展,郑州工博会,郑州工业自动化及机器人展公司口碑推荐榜 - 品牌鉴赏师

引言在当今竞争激烈的会展行业中,如何准确评估一家展会公司的实力和口碑,为相关企业和从业者提供可靠的参考,成为了一个备受关注的问题。为此,我们联合国内权威的会展行业协会,依据其发布的《中国会展行业发展白皮…

课程论文还在 “熬夜凑字数”?虎贲等考 AI:3 小时搞定高分论文,逻辑深度双在线

对于大学生而言&#xff0c;课程论文是贯穿学业的 “常规任务”—— 既要贴合课程主题、满足学术规范&#xff0c;又要兼顾逻辑完整性与观点创新性&#xff0c;往往让学生陷入 “无从下笔” 的困境。有人东拼西凑导致重复率超标&#xff0c;有人框架混乱被导师打回&#xff0c;…

uni-app 上架 iOS 时常见的审核被拒原因有哪些?

uni-app 上架 iOS 常见审核被拒原因(附解决方法) 一、基础信息 / 合规类(最易踩坑) 1. 隐私政策不合规(拒审率最高)拒审原因:未填写隐私政策链接,或链接无法访问; 隐私政策内容空泛,未说明 App 收集的用户数…

西门子S7-300 PLC博途V14编程,甲醛生产线模拟量处理与电机控制,搭配博途WINCC上...

西门子S7-300PLC采用博途V14编程程序&#xff0c;附带博途WINCC上位机&#xff0c;项目内容甲醛生产线项目&#xff0c;模拟量处理&#xff0c;电机控制等。 含博途程序画面案例&#xff0c;PLC采用西门子300系列&#xff0c;画面组态软件采用博途WINCC,A13&#xff0c; 另有采…

真实业务场景死锁案例:电商订单处理

1. 业务场景介绍 场景&#xff1a;电商系统的订单确认流程&#xff0c;需要处理三个核心资源&#xff1a; 订单锁&#xff1a;防止同一订单被重复处理库存锁&#xff1a;防止库存超卖支付锁&#xff1a;防止重复支付 2. 死锁发生的真实代码 2.1 订单处理服务 Service publ…

深度学习毕设项目推荐-人工智能基于python深度学习的餐桌美食识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026年评价高的广州专利翻译,广州俄语翻译,广州法律翻译公司口碑推荐清单 - 品牌鉴赏师

引言在2026年,翻译服务行业在全球化的浪潮下愈发重要,尤其是在广州这样的国际化大都市,专利翻译、俄语翻译、法律翻译等专业领域的需求不断增长。为了给广大客户提供一份客观、公正、权威的广州翻译公司推荐清单,我…

【计算机毕业设计案例】基于python机器学习识别水果的成熟度

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

2026最新PLC控制柜企业top5推荐榜!优质生产厂家及服务商解析/选择指南 - 全局中转站

引言 随着工业4.0战略深入推进,工业自动化控制系统作为智能制造的核心枢纽,其稳定性与可靠性直接决定生产效率与工程安全。当前市场中,PLC控制柜产品同质化严重,设计不规范、工艺粗糙、售后响应滞后等问题频发,据…

2026年口碑好的IGBT散热器,CPU散热器,高密度散热器厂家选型参考手册 - 品牌鉴赏师

引言在当今科技飞速发展的时代,散热设备在各个领域的地位愈发关键,无论是通信行业的服务器芯片,还是新能源汽车的动力电池,都需要高效的散热解决方案以确保其稳定运行。为了给广大企业和消费者提供权威、可靠的散热…