一、ArrayBlockingQueue的poll方法底层原理

ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队列。它的 poll() 方法是用于从队列中移除并返回队首元素的核心方法之一。与 take() 方法不同,poll() 方法在队列为空时不会阻塞,而是立即返回 null。

1、poll() 方法的功能

  • 作用:移除并返回队列的队首元素。

  • 非阻塞行为:如果队列为空,立即返回 null,不会阻塞当前线程。

  • 线程安全:poll() 方法是线程安全的,内部通过锁机制实现同步。

2、poll() 方法的源码分析

以下是 ArrayBlockingQueue 中 poll() 方法的源码(基于 JDK 17):

关键点解析

1、获取锁:

  • 使用 lock.lock() 获取锁,确保线程安全。

  • 如果锁被其他线程持有,当前线程会阻塞,直到获取锁。

2、检查队列是否空:

  • 如果队列空(count == 0),直接返回 null。

  • 如果队列非空,调用 dequeue() 方法移除并返回队首元素。

3、释放锁:

  • 在 finally 块中释放锁,确保锁一定会被释放,避免死锁。

3、dequeue() 方法的源码分析

dequeue 是 poll() 方法中用于实际移除元素的私有方法。以下是其源码:

关键点解析

1、获取队首元素:

  • 从数组的 takeIndex 位置获取队首元素。

  • takeIndex 是下一个移除元素的位置。

2、清除队首元素:

  • 将 takeIndex 位置的元素设置为 null,帮助垃圾回收。

3、更新 takeIndex:

  • 如果 takeIndex 达到数组长度,将其重置为 0,实现循环数组的效果。

4、更新元素数量:

  • count 表示队列中的元素数量,移除成功后递减。

5、唤醒生产者线程:

  • 调用 notFull.signal() 唤醒等待 notFull 条件的生产者线程。

4、poll() 方法的非阻塞机制

poll() 方法的非阻塞行为是通过直接检查队列是否空来实现的。如果队列空,立即返回 null,不会调用 await() 方法阻塞当前线程。

5、poll() 方法的性能优化

  • 循环数组:

    • ArrayBlockingQueue 使用循环数组存储元素,避免了数组的频繁扩容和数据拷贝。

    • 通过 putIndex 和 takeIndex 实现队列的循环利用。

  • 锁分离:

    • 使用单独的 Condition 对象(notFull 和 notEmpty)分别管理生产者和消费者的等待队列,减少锁竞争。
  • 公平性:

    • 可以通过构造函数指定是否使用公平锁。公平锁会按照线程等待的顺序分配锁,避免线程饥饿。

二、总结

ArrayBlockingQueue 的 poll() 方法通过以下机制实现了线程安全的非阻塞移除:

1、锁机制:使用 ReentrantLock 保证线程安全。

2、非阻塞行为:如果队列空,立即返回 null,不会阻塞当前线程。

3、循环数组:通过循环数组高效管理队列元素。

ArrayBlockingQueue的poll方法底层原理的更多相关文章

  1. KVO-基本使用方法-底层原理探究-自定义KVO-对容器类的监听

    书读百变,其义自见! 将KVO形式以代码实现呈现,通俗易懂,更容易掌握 :GitHub   -链接如果失效请自动搜索:https://github.com/henusjj/KVO_base 代码中有详 ...

  2. synchronized底层原理

    synchronized底层语义原理 Java 虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现. 在 Java 语言中,同步用的最多的地方可能是被 syn ...

  3. HashMap底层原理分析(put、get方法)

    1.HashMap底层原理分析(put.get方法) HashMap底层是通过数组加链表的结构来实现的.HashMap通过计算key的hashCode来计算hash值,只要hashCode一样,那ha ...

  4. Linux高级字符设备驱动 poll方法(select多路监控原理与实现)

    1.什么是Poll方法,功能是什么? 2.Select系统调用(功能)      Select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程.      int selec ...

  5. 红黑树规则,TreeSet原理,HashSet特点,什么是哈希值,HashSet底层原理,Map集合特点,Map集合遍历方法

    ==学习目标== 1.能够了解红黑树 2.能够掌握HashSet集合的特点以及使用(特点以及使用,哈希表数据结构) 3.能够掌握Map集合的特点以及使用(特点,常见方法,Map集合的遍历) 4.能够掌 ...

  6. Java面试底层原理

    面试发现经常有些重复的面试问题,自己也应该学会记录下来,最好自己能做成笔记,在下一次面的时候说得有条不紊,深入具体,面试官想必也很开心.以下是我个人总结,请参考: HashSet底层原理:(问了大几率 ...

  7. 并发队列:ArrayBlockingQueue实际运用场景和原理

    ArrayBlockingQueue实际应用场景 之前在某公司做过一款情绪识别的系统,这套系统通过调用摄像头接口采集人脸信息,将采集的人脸信息做人脸识别和情绪分析,最终经过一定的算法将个人情绪数据转化 ...

  8. Java8线程池ThreadPoolExecutor底层原理及其源码解析

    小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jett ...

  9. 【T-SQL进阶】02.理解SQL查询的底层原理

    本系列[T-SQL]主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础]04.表表达式 ...

  10. HashMap的底层原理

    简单说: 底层原理就是采用数组加链表: 两张图片很清晰地表明存储结构: 既然是线性数组,为什么能随机存取?这里HashMap用了一个小算法,大致是这样实现: // 存储时: int hash = ke ...

随机推荐

  1. shell脚本中的变量

    在shell脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的作用当然不是为了专业.如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一个命令或者路径几百次.突然你觉得 ...

  2. python的typing模块

    python的typing模块 参考:3个提高 Python 开发效率的小工具.Python3 Typing模块详解 typeing模块在python中提供类型支持,主要功能有: 类型检查,防止运行时 ...

  3. c++:-8

    上一节学习了C++的STL库和范型:c++:-7,本节学习c++的输入输出和流类库. I/O流 (1)程序与外界环境的信息交换 当程序与外界环境进行信息交换时,存在着两个对象:程序中的对象.文件对象. ...

  4. HashMap的put方法的扩容流程

    final Node<K,V>[] resize() { // [1,2,3,4,5,6,7,8,9,10,11,,,,] Node<K,V>[] oldTab = table ...

  5. Windows PowerShell 终端配置

    如何修改 Windows PowerShell 的提示符 Windows PowerShell 支持配置文件,可以创建配置文件,通过配置文件来修改 配置文件路径 打开一个Windows Powersh ...

  6. [新]Java8的新特性

    原文首发在我的博客:https://blog.liuzijian.com/post/86955c3b-9635-47a0-890c-f1219a27c269.html 1.Lambda表达式 lamb ...

  7. oracle11gRAC升级到19C

    升级oracle11g集群到19.3 前述环境检查: [root@qhdb1 ~]# crsctl status res -t ------------------------------------ ...

  8. Calcite 获取jdbc连接流程

    一.类调用 简介:calcite可以连接各数据源,做查询.可以收口查询权限,查询多引擎需求 二. 获取Connection发送的请求 请求介绍文档:https://calcite.apache.org ...

  9. FreeSql学习笔记——0.FreeSql启动!

    FreeSql FreeSql是功能强大的 .NET ORM,支持 .NetFramework 4.0+..NetCore 2.1+.Xamarin等支持 NetStandard 所有运行平台.支持  ...

  10. 从 14 秒到 1 秒:MySQL DDL 性能优化实战

    1. 问题背景 MySQL版本:8.0.30 测试表数据量:200万 在 MySQL 中,研发人员最初执行了以下 SQL 语句,向表 t_email 中添加了一个允许为 NULL 的列 id3,并设置 ...