PriorityBlockingQueue 的put方法底层源码
一、PriorityBlockingQueue 的put方法底层源码
PriorityBlockingQueue 的 put 方法用于将元素插入队列。由于 PriorityBlockingQueue 是一个无界队列,put 方法不会阻塞,总是会成功插入元素
1、put 方法的作用
将元素插入队列。
由于队列无界,put 方法不会阻塞,总是会成功插入元素。
插入后,队列会根据元素的优先级重新排序。
2、put 方法的源码
以下是 PriorityBlockingQueue 中 put 方法的源码(基于 JDK 17):

可以看到,put 方法直接调用了 offer 方法。因此,我们需要进一步分析 offer 方法的实现。
3、offer 方法的源码
以下是 PriorityBlockingQueue 中 offer 方法的源码:

4、源码解析
(1)参数检查

- PriorityBlockingQueue 不允许插入 null 元素,如果传入 null,会抛出 NullPointerException。
(2)获取锁

lock 是 PriorityBlockingQueue 的成员变量,用于控制插入和移除操作的并发访问。
调用 lock() 方法获取锁。
(3)检查队列容量

size 是当前队列中的元素数量。
如果队列已满(n >= queue.length),调用 grow() 方法扩容。
grow() 方法的实现:

(4)插入元素并调整堆结构

- siftUp 方法将元素插入堆中,并调整堆结构以维持堆的性质:


siftUp 方法通过比较元素和其父节点,将元素插入到正确的位置,以维持堆的性质(最小堆或最大堆)
(5)更新队列大小

- 将队列大小加 1。
(6)唤醒消费者线程

- 如果队列之前为空,调用 notEmpty.signal() 唤醒可能正在等待的消费者线程。
(7)释放锁

- 在 finally 块中释放锁,确保锁一定会被释放,避免死锁。
(8)返回结果

- 由于队列无界,offer 方法总是返回 true。
二、关键点总结
无界队列:PriorityBlockingQueue 是无界队列,put 方法不会阻塞。
堆结构:使用堆数据结构维护元素的优先级顺序。
线程安全:通过 ReentrantLock 保证线程安全。
动态扩容:当队列容量不足时,会自动扩容。
三、示例流程图
以下是 put 方法的执行流程图:
1、检查元素是否为 null。
2、获取锁。
3、检查队列容量,如果不足则扩容。
4、将元素插入堆中,并调整堆结构。
5、更新队列大小。
6、如果队列之前为空,唤醒消费者线程。
7、释放锁。
8、返回 true。
PriorityBlockingQueue 的put方法底层源码的更多相关文章
- Android开发之漫漫长途 Ⅵ——图解Android事件分发机制(深入底层源码)
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
- 为什么很多类甚者底层源码要implements Serializable ?
为什么很多类甚者底层源码要implements Serializable ? 在碰到异常类RuntimeException时,发现Throwable实现了 Serializable,还有我们平进的ja ...
- List-LinkedList、set集合基础增强底层源码分析
List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...
- 从底层源码浅析Mybatis的SqlSessionFactory初始化过程
目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...
- Java泛型底层源码解析-ArrayList,LinkedList,HashSet和HashMap
声明:以下源代码使用的都是基于JDK1.8_112版本 1. ArrayList源码解析 <1. 集合中存放的依然是对象的引用而不是对象本身,且无法放置原生数据类型,我们需要使用原生数据类型的包 ...
- 2018.11.20 Struts2中对结果处理方式分析&struts2内置的方式底层源码剖析
介绍一下struts2内置帮我们封装好的处理结果方式也就是底层源码分析 这是我们的jar包里面找的位置目录 打开往下拉看到result-type节点 name那一列就是我们的type类型取值 上一篇博 ...
- HashMap和ConcurrentHashMap的区别,HashMap的底层源码
HashMap本质是数组加链表,根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap在HashMap的基础 ...
- 总结HashSet以及分析部分底层源码
总结HashSet以及分析部分底层源码 1. HashSet继承的抽象类和实现的接口 继承的抽象类:AbstractSet 实现了Set接口 实现了Cloneable接口 实现了Serializabl ...
- LInkedList总结及部分底层源码分析
LInkedList总结及部分底层源码分析 1. LinkedList的实现与继承关系 继承:AbstractSequentialList 抽象类 实现:List 接口 实现:Deque 接口 实现: ...
- Vector总结及部分底层源码分析
Vector总结及部分底层源码分析 1. Vector继承的抽象类和实现的接口 Vector类实现的接口 List接口:里面定义了List集合的基本接口,Vector进行了实现 RandomAcces ...
随机推荐
- 利用坦克PWA3快速为应用配置域名:以Gogs为例
全文概述 本文介绍了如何利用坦克PWA3平台快速为Gogs应用配置域名的过程.随着互联网技术的发展,自托管Git服务变得越来越受欢迎,其中Gogs凭借其轻量级和易于安装的特点受到众多开发者的青睐.为提 ...
- Codeforces Round 961 (Div. 2)
题目链接:Codeforces Round 961 (Div. 2) 总结:B1wa两发可惜,C出得有点小慢. A. Diagonals fag:贪心 Description:给定一个\(n * n\ ...
- linxu7下安装pacemaker+corosync集群-01
1.yum仓库的配置-自行配置 2.安装软件包: yum -y install pacemaker* corosync* pcs* psmisc yum -y install pcs fence-ag ...
- @所有Mac用户 刺客信条系列登陆Mac平台!
[历史性的跨越] 在无数Mac游戏爱好者的热切期盼中,终于将风靡全球的3A级巨作--刺客信条系列,成功移植至MacOS系统!这意味着,无论是穿梭于中世纪欧洲的隐秘巷弄,还是翱翔于维多利亚时代的伦敦天际 ...
- Q:nginx 访问报错403 forbidden
curl 访问本地时 403 forbidden 查看nginx日志,路径为/var/log/nginx/error.log (13: Permission denied),详细报错如下: 2021 ...
- 三种方式从jdbc中获取数据库表字段信息
一.整体代码 1.method1:执行select语句获取,select * from dims where 1 = 2 2.method2:执行show create table获取,show cr ...
- SpringBoot使用Log4J2
一.常用日志框架 Log4j:Apache的一个开源项目,可以控制日志信息输送的目的地是控制台.文件.GUI组件等,可以控制每一条日志的输出格式,这些可以通过一个配置文件来灵活地进行配置,而不需要修改 ...
- mysqldump从mysql迁移数据到OceanBase
使用mysqldump导出数据 /usr/bin/mysqldump --single-transaction -B employees -S /data/mysql/mysql.sock -uroo ...
- 刚刚!百度搜索“换脑”引爆AI圈,正式接入DeepSeek R1满血版
一.今天发现百度搜索出现已接入DeepSeek的提示,再也不用担心使用DeepSeek时出现"服务器繁忙,请稍后再试."的问题了. 在百度搜索首页出现[即刻体验AI搜索Deep ...
- 库卡机器人KR240电源模块维修思路讲解
一.库卡机器人KR240电源模块故障诊断 故障诊断是维修过程中的关键步骤.使用库卡提供的诊断工具或软件,对库卡机器人KR240电源模块进行故障诊断.重点关注电源供应.输出电压.电流等关键参数.通过诊断 ...