JDK并发队列概览
典型特性
Queue vs Deque
Deque 是 双端队列,它的侧重点是支持队列首尾都能添加删除元素。
Deque 提供了更多方法,如典型的 offerLast(e),pollLast()
Blocking vs 非Blocking
Blocking表示队列提供了“等待性”相关操作。
如,获取元素时会等到队列中有元素时再返回;添加元素时会等到队列有空间时再添加。
/** * Inserts the specified element into this queue, waiting if necessary * for space to become available. */ void put(E e) throws InterruptedException; /** * Retrieves and removes the head of this queue, waiting if necessary * until an element becomes available. */ E take() throws InterruptedException;
有界队列 vs 无界队列
我非常讨厌这样的区分方式,过于强行分类!虽然JDK注释里也使用 bounded/unbounded 这样的形容词,我觉得这种分类方式欠妥;“有界/无界”这种字眼也不适合出现在考题里。
有界还是无界,其实就是队列的容量限制的差别。JDK中真正的无界队列比较少。虽然JDK将某些队列划为无界队列,但其内部数据结构就决定了所谓“无界队列”的上限。
通常,各队列实现的 size() 方法返回的就是 int 类型的值,它们的容量一般不会超过 Integer.MAX_VALUE 。
当然 LinkedTransferQueue 这种特殊队列的元素数量可能超过 Integer.MAX_VALUE。接口 Collection 中对 size() 的定义就允许这种情况。
-
ArrayBlockingQueue:最典型的 有界队列。在创建时就需指定容量,且无法更改。
初始化时就创建内部数组,该数组为 final 字段。 -
LinkedBlockingQueue:即可以是 无界队列,也可以是 有界队列。如果在创建时未指定容量,就会使用默认容量 Integer.MAX_VALUE,成为 无界队列。(所谓有界和无界,其实界限是模糊的)
该队列内部通过链表实现。单就链表而言,它是无界的。 -
SynchronousQueue:非常特殊的队列,容量为0。看上去就像,每个删除操作都要等待插入操作,每个插入操作都要等待删除操作。即,元素通过此队列从生产者瞬间转移到消费者,而不会在队列中滞留。
Executors.newCachedThreadPool() 中就用了该队列。
Dubbo服务的默认线程池队列大小为0,所使用的队列也是 SynchronousQueue -
PriorityBlockingQueue:这是 无界队列,元素之间有优先顺序。其实现者考虑到各JVM实现细节的差异,将队列的容量上限规定为 Integer.MAX_VALUE - 8。
其内部使用了 java.util.PriorityQueue -
DelayedQueue:这是 无界队列。不常用到。其元素必须实现接口 java.util.concurrent.Delayed。只有过期的元素才能被取出。
其内部使用了 java.util.PriorityQueue -
LinkedTransferQueue:这是 无界队列。特殊的BlockingQueue,元素的添加者可以等待直到元素被消费者取走。
其内部基于链表实现
如何选择
是否需要“等待性”语义?
如果需要“等待性”语义,则在 BlockingQueue 中选;否则可以考虑 ConcurrentLinkedQueue。
BlockingQueue 最常见的是在 ArrayBlockingQueue、LinkedBlockingQueue 和 SynchronousQueue 之间选择。
对队列容量的要求
ArrayBlockingQueue 有明确的容量限制;
LinkedBlockingQueue 也可以在创建时指定一个容量; SynchronousQueue 的容量是 0
对空间利用的要求
这方面,ArrayBlockingQueue 与 LinkedBlockingQueue 的区别就是 数组 与 链表 的区别。
ArrayBlockingQueue 更紧凑,不需创建节点;但它在初始化时就需要一次性分配一段连续的空间,对初始内存的需求更大。
对吞吐量的要求
ArrayBlockingQueue 中 notEmpty 和 notFull 是对同一个 ReentrantLock 的条件变量。
LinkedBlockingQueue 对锁操作的粒度更细,notEmpty 和 notFull 是不同 ReentrantLock 的条件变量。
所以LinkedBlockingQueue的吞吐量会相对好一点。
这种不同粒度的锁机制其实也是内部实现原理延伸出来的。因为链表结构更容易实现这种细粒度的锁。
性能的稳定性
ArrayBlockingQueue 的实现比较简单,它的性能比较好预测,表现比较稳定。
SynchronousQueue 很多时候性能大大超过其它实现,特别是队列元素较少的时候。
其它
前述考虑点是比较常见的。
是否需要双端操作(Deque)、是否需要支持元素优先级(PriorityBlockingQueue)、是否需要利用元素过期特性(DelayedQueue)、是否等待消费者获取(TransferQueue)等需求不多见。如果有相关需求,选择也很明确。
相关推荐
java并发编程的联系代码,由低到高,包含线程安全、锁、线程通讯、线程池、Concurrent包内容的使用、各种阻塞队列的联系等知识。
网络有协议,java 高并发io框架netty。数据结构包括堆栈,队列,链表,二叉树,红黑树,算法包括各种排序,贪心算法,动态规划。以及进阶的分布式,大数据,机器学习,内容非常全,精心总结的。
Slogan:互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识,后端同学必看,前端同学也可学习 本项目大部分内容来自中华石杉,版权归作者所有,内容涵盖高并发、...
面试 JVM、数据结构、并发 Spring Cloud 、redis、mysql Kafka 消息队列 分布式事务 大数据 hadoop yarn zookeeper 面试算法
解压有doc目录下,md文件,使用支持md文档的阅读器打开即可浏览,包括消息队列,搜索引擎,缓存,分库分表,读写分离,高并发,分布式,分布式锁,分布式事务,限流、熔断、降级,微服务架构,高可用架构等知识,
网络有协议,java 高并发io框架netty。数据结构包括堆栈,队列,链表,二叉树,红黑树,算法包括各种排序,贪心算法,动态规划。以及进阶的分布式,大数据,机器学习,内容非常全,精心总结的。
Java并发编程(J.U.C) :thumbs_up: 疯狂更新中…… Java8实战 Java注解 :baby_chick: Redis 面试八股文 知识点详解 :tiger_face: 消息队列(kafka) :cow_face: 分布式 :ewe: 关系数据库 :frog: 五分钟入门系列 :horse_...
基础核心 基础知识 反射 泛型 动态代理 JDK8新特性 集合容器 多线程与并发 Spring SpringMVC SpringBoot Mybatis 数据结构与算法 入门基础 基础数据结构 数组&链表 数组&链表进阶 栈 队列 算法思想 数论&枚举&递归&...
互联网 Java 工程师进阶知识完全扫盲 本系列知识出自中华石杉,我对这部分知识做了一个系统的整理,方便学习查阅。By the way,微信公众号石杉的架构笔记(id:shishan100)有其它很多架构知识,墙裂推荐~ 一点...
进阶篇 类加载 JVM 垃圾回收 线程 线程池 锁 高并发 第三章 中间件篇 缓存 远程调用 消息队列 任务调序 搜索引擎 分布式锁 监控 日志监控 限流&熔断 分库分表 配置中心 API网关 第四章 架构设计篇 系统设计 UML 流程...
Java进阶 并发 JVM Java网络编程 计算机基础 计算机网络 todo 操作系统 todo Linux相关 todo 数据结构与算法 todo 数据结构 todo 算法 todo 数据库 todo MySQL 缓存 Redis 消息队列 Kafka 大后端 分布式 理论 技术 ...
标题:<Java进阶课程之并发编程快速入门与多线程实战项目> 课程内容: 1.CPU调度算法原理(先来先服务、最短作业法、优先级调度算法) 2.站在字节码角度+cpu上下文切换角度分析线程安全问题 3.手写Callable与...
Java基础、并发、面向对象、Web开发 ☆☆☆☆ 03 SpringCloud微服务基础组件案例详解 ☆☆☆ 04 SpringCloud微服务架构实战综合案例 ☆☆☆☆☆ 05 SpringBoot框架基础应用入门到进阶 ☆☆☆☆ 06 SpringBoot框架...
包含树、图、线性表、栈、队列、动态规划、回溯等多种算法的讲解。
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
第三部分 进阶: C,C++代码阅读与控制 201 第9章 语法与初级标准库 202 9.1 C++的基于过程设计 203 9.2 C++的基于对象设计: 模板与设计 203 9.3 面向对象设计 204 9.4 泛型开发与初级StdC库 204 第10章 数据逻辑与...
具体包含以下几个方面:1.java基础 2.java并发 3.java虚拟机 4.android基础 5.android进阶 6.开源框架(okhttp、retrofit、eventbus) 7. 线性表 8.栈和队列 9.树 10.图 11.算法 12.剑指offer 13.leetcode 14.java...
⼤数据⼯程师学习计划 申明:本⽂旨在为普通程序员(Java程序员最佳)提供⼀个⼊门级别的⼤数据技术学习路径,不适⽤于⼤数据⼯程师的进阶学习,也不适⽤ 于零编程基础的同学。 前⾔ ⼀、背景介绍 本⼈⽬前是⼀名⼤...
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...