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是一种广泛使用的面向对象编程(OOP)语言,其核心原则包括封装、继承、多态和抽象。封装是将数据和操作数据的方法捆绑在一起,保护数据不受外部非法访问。继承允许一个类(子类)继承另一个类(父类)的属性和...
`Concurrent`包包含了大量设计精良且线程安全的数据结构,如`ConcurrentHashMap`(线程安全的哈希映射),`ConcurrentLinkedQueue`(无界的并发队列)和`CopyOnWriteArrayList`(写时复制的列表)等。这些数据结构在...
JUC(Java Utilities for Concurrency)是 Java 并发编程的核心API,提供了多种并发编程机制,帮助开发者编写高效、可靠的并发程序。JUC 中包括了各种锁机制、原子变量、并发集合类、线程池、异步回调等多种机制,...
接下来是“Java进阶”部分,这部分将深入探讨更多高级特性: 1. **多线程**:Java提供的Thread类和Runnable接口,线程同步机制(synchronized关键字、wait/notify、Lock锁)以及并发工具类。 2. **网络编程**:套...
在Java工程师的进阶学习中,理解SQL语言的基本语法和高级特性至关重要,包括DML(数据操作)、DDL(数据定义)和DCL(数据控制)。此外,掌握事务处理、存储过程、索引优化、查询优化等技能,能有效提升应用程序的...
2. **类与对象**:面向对象是Java的核心特性,包括类的定义、对象的创建、封装、继承、多态等概念。深入理解类的构造器、访问修饰符、静态成员、final关键字,以及抽象类和接口的运用,都是面试中常问的话题。 3. *...
本资源摘要信息涵盖了 Java 工程师进阶知识的多个方面,包括消息队列的使用、优点和缺点、高可用性、消息消费的幂等性、消息队列的顺序性、消息队列的延时和过期失效问题等。 一、消息队列的使用 * 消息队列是异步...
1. **高并发处理**:Java并发编程是大型系统中的关键,可能涉及到线程池、并发容器、锁机制、异步处理等概念。 2. **微服务架构**:包括Spring Boot、Spring Cloud等框架的使用,以及服务发现、熔断、限流、降级等...
在准备JAVA全栈核心知识点的面试时,理解并掌握以下几个关键领域是至关重要的: 1. **JVM(Java虚拟机)**:JVM是Java程序的运行环境,它负责类的加载、验证、执行字节码以及垃圾回收。了解JVM内存模型(包括堆、栈...
在"项目说明.zip"中,可能包含了实际项目案例或练习题,这些可以帮助你将理论知识应用于实践中,进一步巩固和提升Java进阶技能。学习过程中,不仅要掌握理论,还要通过动手实践来检验和加深理解。不断学习、实践和...
- **具体实现**:深入学习`ArrayList`(基于数组的列表实现)、`LinkedList`(双向链表实现)、`Vector`(线程安全的`ArrayList`)、`Stack`(基于`Vector`实现的后进先出队列)、`PriorityQueue`(基于优先级的...
《Java进阶之路(黑夜版)》不仅是一本学习指南,更是每一位Java学习者的良师益友。它通过深入浅出的方式讲解了Java的核心知识,并结合作者丰富的实战经验和幽默风趣的语言风格,使得学习过程既轻松又高效。对于希望...
### Java进阶路线详解 #### 一、Java基础 **1. 传值与传引用** 在Java中,基本类型(如int、char等)的传递是按值传递的,而对象类型的传递则是按引用传递的。理解这一点对于正确处理变量和对象之间的交互至关...
网络有协议,java 高并发io框架netty。数据结构包括堆栈,队列,链表,二叉树,红黑树,算法包括各种排序,贪心算法,动态规划。以及进阶的分布式,大数据,机器学习,内容非常全,精心总结的。
### Java进阶知识 #### 1. 异常处理 - **异常类型**:了解运行时异常和编译时异常的区别。 - **异常处理机制**:掌握try-catch-finally结构;学会抛出自定义异常。 #### 2. 集合框架 - **集合接口**:理解List、...
**Java-Guide:Java核心知识笔记** 这是一份详尽的Java学习资源,旨在帮助Java开发者巩固和深化其核心知识。这份笔记包含了从基础到高级的各类Java编程概念,是学习和进阶Java技术的宝贵资料。Markdown格式使得内容...
**Java进阶与架构师思维导图** 在深入探讨Java进阶和架构师思维之前,首先需要理解Java语言的基础知识。Java是一种广泛使用的面向对象编程语言,以其平台无关性、安全性和可移植性而闻名。从Java入门到成为一名专业...
这个压缩包内含的资料丰富多样,旨在帮助个人提升编程技能,理解Java的核心概念,掌握并发编程、虚拟机运作原理,以及运用经典的设计模式。此外,它还涉及到数据结构与算法的深入学习,以及常用组件如Redis和My的...
Slogan:互联网 Java 工程师进阶知识完全扫盲:涵盖高并发、分布式、高可用、微服务、海量数据处理等领域知识,后端同学必看,前端同学也可学习 本项目大部分内容来自中华石杉,版权归作者所有,内容涵盖高并发、...
根据提供的文件信息:“JAVA并发编程实战.pdf”,我们可以深入探讨与Java并发编程相关的多个核心知识点。 ### Java并发编程基础 #### 1. 并发与并行 - **并发(Concurrency)**:指一个程序中存在多个执行序列(如...