LinkedBlockingQueue的poll方法底层原理
一、LinkedBlockingQueue的poll方法底层原理
LinkedBlockingQueue 的 poll 方法用于从队列头部移除并返回元素。如果队列为空,poll 方法会立即返回 null,而不会阻塞线程
1、poll 方法的作用
从队列头部移除并返回元素。
如果队列为空,立即返回 null。
该方法是非阻塞的,适用于需要快速响应的场景。
2、poll 方法的源码
以下是 LinkedBlockingQueue 中 poll 方法的源码(基于 JDK 17):
3、源码解析
(1)检查队列是否为空
count 是一个 AtomicInteger,表示当前队列中的元素数量。
如果队列为空(count.get() == 0),立即返回 null。
(2)获取锁
takeLock 是 LinkedBlockingQueue 的成员变量,用于控制移除操作的并发访问。
调用 lock() 方法获取锁。
(3)再次检查队列是否为空
- 在加锁后再次检查队列是否为空,避免在加锁期间队列状态发生变化
(4)移除元素
调用 dequeue 方法从队列头部移除节点并返回其元素。
dequeue 方法的实现:
(5)更新元素数量
- 使用 AtomicInteger 的 getAndDecrement 方法将队列元素数量减 1,并返回减 1 之前的值(c)
(6)唤醒其他消费者线程
- 如果移除后队列不为空(c > 1),调用 notEmpty.signal() 唤醒其他可能正在等待的消费者线程。
(7)释放锁
- 在 finally 块中释放锁,确保锁一定会被释放,避免死锁。
(8)唤醒生产者线程
如果移除前队列已满(c == capacity),调用 signalNotFull() 唤醒可能正在等待的生产者线程。
signalNotFull() 的实现:
(9)返回移除的元素
- 返回从队列头部移除的元素。
二、关键点总结
非阻塞:如果队列为空,poll 方法会立即返回 null,而不会阻塞线程。
锁分离:LinkedBlockingQueue 使用两把锁(putLock 和 takeLock),分别控制插入和移除操作,提高了并发性能。
条件变量:使用 notFull 和 notEmpty 两个 Condition 实现线程的阻塞和唤醒。
线程安全:通过锁和原子变量(AtomicInteger)保证线程安全。
三、与 take 方法的对比
四、示例代码
以下是一个简单的示例,展示 poll 方法的使用场景:
LinkedBlockingQueue的poll方法底层原理的更多相关文章
- KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听
书读百变,其义自见! 将KVO形式以代码实现呈现,通俗易懂,更容易掌握 :GitHub -链接如果失效请自动搜索:https://github.com/henusjj/KVO_base 代码中有详 ...
- synchronized底层原理
synchronized底层语义原理 Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现. 在 Java 语言中,同步用的最多的地方可能是被 syn ...
- HashMap底层原理分析(put、get方法)
1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...
- Linux高级字符设备驱动 poll方法(select多路监控原理与实现)
1.什么是Poll方法,功能是什么? 2.Select系统调用(功能) Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程. int selec ...
- 红黑树规则,TreeSet原理,HashSet特点,什么是哈希值,HashSet底层原理,Map集合特点,Map集合遍历方法
==学习目标== 1.能够了解红黑树 2.能够掌握HashSet集合的特点以及使用(特点以及使用,哈希表数据结构) 3.能够掌握Map集合的特点以及使用(特点,常见方法,Map集合的遍历) 4.能够掌 ...
- Java面试底层原理
面试发现经常有些重复的面试问题,自己也应该学会记录下来,最好自己能做成笔记,在下一次面的时候说得有条不紊,深入具体,面试官想必也很开心.以下是我个人总结,请参考: HashSet底层原理:(问了大几率 ...
- Java8线程池ThreadPoolExecutor底层原理及其源码解析
小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jett ...
- 【T-SQL进阶】02.理解SQL查询的底层原理
本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...
- HashMap的底层原理
简单说: 底层原理就是采用数组加链表: 两张图片很清晰地表明存储结构: 既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: // 存储时: int hash = ke ...
- 操作系统底层原理与Python中socket解读
目录 操作系统底层原理 网络通信原理 网络基础架构 局域网与交换机/网络常见术语 OSI七层协议 TCP/IP五层模型讲解 Python中Socket模块解读 TCP协议和UDP协议 操作系统底层原理 ...
随机推荐
- 再谈Redux
2025年再聊前端状态管理似乎是一件不必要的事,毕竟相关文章已堆积得如山如海.但在这些文章或视频内容中,我并没有找到自己喜欢的方案,准确的说是使用方式.所以这篇文章不做技术分析,主要聊聊个人对状态管理 ...
- Practical Secure Aggregation for Privacy-Preserving Machine Learning
1 介绍 本文是谷歌团队发在CCS2017上的文章,旨在解决联邦学习中安全聚合的问题. 安全聚合:多方参与者将信息传递给聚合者,聚合者除了知道这个信息的总和不能知道任何一个特定参与者的信息. 在这篇文 ...
- 远程连接Windows
远程桌面连接 限制 1.同网段 (1)服务器关闭防火墙 (2)服务器端 右键点击'我的电脑'进入'属性'点击左侧菜单栏中的'远程设置': 把远程桌面选项设置成'允许运行任意版本远程桌面的计算机连接'. ...
- C#从数据库中加载照片的
从数据库中读取人员照片信息并加载到图片控件的代码 string conn = "Server=192.168.xx.xx;Database=dbName;User ID=sa;passwor ...
- flutter真机调试出现flutter Launching 'app' on No Devices.
1. flutter真机调试出现flutter Launching 'app' on No Devices. flutter Launching 'app' on No Devices. 我的是华为手 ...
- P1787 [入门赛 #22]非众数 Hard Version 题解
P1787 [入门赛 #22]非众数 Hard Version 题解 原题传送门 这里对 pjh0625 的题解进行了详细解释 1. 读题 题目要求计算给定字符串中非众数子串的数量. 非众数子串 的定 ...
- 玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之上传下载极速推进,纵享丝滑体验!
本文分享自天翼云开发者社区<玩转云端|天翼云边缘安全加速平台AccessOne实用窍门之上传下载极速推进,纵享丝滑体验!>,作者:天翼云社区官方账号 随着传媒行业数字化转型驶入深水区,如何 ...
- HPC云化部署的优势和挑战
本文分享自天翼云开发者社区<HPC云化部署的优势和挑战> 作者:土豆炒肉丝 HPC云化部署指的是将高性能计算(HPC)工作负载部署在云计算平台上,这种方式带来了一些明显的优势,但同时也面临 ...
- [TJOI2015] 弦论 题解
所有子串,一眼 \(\text{SAM}\). 从根开始一直往下走,走到任何一个点都代表一个子串.维护 \(sm\) 表示每个子串有几个(\(t=0\) 就当一个),可以用树形 \(dp\) 跳后缀链 ...
- Ansible 数百台批量操作前期准备工作
Ansible 数百台批量操作前期准备工作 背景: 当前有100台服务器在同一个内网,需要统一部署业务程序并且对主机修改主机名,只提供了一个文档host_user.txt,内容 " IP 用 ...