Java Queue Summary
Java Queue Summary
一、概要
Queue 8个 / Deque 3个
类名 | since | 线程安全 | element null | 特点 |
---|---|---|---|---|
Queue | 1.5 | |||
ArrayBlockingQueue | 1.5 | Yes | No | 基于数组实现的有界阻塞队列 一个ReentrantLock配合两个Condition实现多线程阻塞唤醒,提供公平锁以保证线程访问的FIFO 公平性通常会降低吞吐量,但会降低可变性并且避免线程饥饿 适合作为生产消费模型的buffer队列 |
LinkedBlockingQueue | 1.5 | Yes | No | 基于链表实现的可选边界的阻塞队列 两个ReentrantLock配合各自一个Condition,通过原子变量计数判断边界,实现多线程阻塞唤醒 链表式队列通常比数组式队列有更高的吞吐量,但是在大多数并发程序中,性能不太可预测 适合作为生产消费模型的buffer队列 LinkedBlockingQueue比ArrayBlockingQueue吞吐量高原因是独立的put/take锁,通过原子变量来协调两个锁的阻塞操作 |
ConcurrentLinkedQueue | 1.5 | Yes | No | 基于链表实现的无界非阻塞队列 通过CAS自旋保证线程安全 Head节点和Tail节点存在滞后性 吞吐量比LinkedBlockingQueue更高 |
PriorityQueue | 1.5 | No | No | 通过完全二叉树实现的小顶堆,底层是数组,父子节点索引可以通过公式转换 leftChildNo=parentNo×2+1 rightChildNo=parentNo×2+2 parentNo=(nodeNo-1)>>>1 offer时只生成小顶堆,poll后再次调整小顶堆,保证第一个元素最小 |
PriorityBlockingQueue | 1.5 | Yes | No | 无界优先阻塞队列 基于PriorityQueue实现 一个ReentrantLock配合一个Condition阻塞获取操作 扩容时先unlock,通过CAS抢占扩容,然后lock,扩容成功则复制原数组到新数组 |
DelayQueue | 1.5 | Yes | No | Delayed元素的无界阻塞队列,一个元素只有过期才能被获取 基于PriorityQueue实现 一个ReentrantLock配合一个Condition阻塞操作,当队列头部有新元素可用或新线程可能需要成为领导者时发出条件信号 |
SynchronousQueue | 1.5 | Yes | No | 不存储任何元素 提供公平性模式(TransferQueue)以保证线程访问的FIFO 通过CAS自旋保证线程安全 |
LinkedTransferQueue | 1.7 | Yes | No | 基于链表的无界转移队列 与SynchronousQueue.TransferQueue(公平模式)相比,可以peek,可以统计长度 与LinkedBlockingQueue相比,性能更高(CAS自旋) 与ConcurrentLinkedQueue相比,可以阻塞 |
Deque | 1.6 | |||
LinkedList | 1.2 | No | Yes | 基于链表同时实现List与Deque两个接口(作者不推荐用) |
ArrayDeque | 1.6 | No | No | 基于环状数组实现双端队列,初始容量16,双倍扩容 作为栈比Stack更快,作为队列比LinkedList更快 |
LinkedBlockingDeque | 1.6 | Yes | No | 基于链表实现的可选边界的阻塞双端队列 一个ReentrantLock配合两个Condition实现多线程阻塞唤醒 常用于 “工作窃取算法” |
ConcurrentLinkedDeque | 1.7 | Yes | No | 基于链表实现的无界非阻塞双端队列 通过CAS自旋保证线程安全 吞吐量比LinkedBlockingDeque更高 |
分类:
java / jdk / 集合
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-03-09 人形词云,根据图片黑白形状绘制词云
2020-03-09 汉化的simple词云
2020-03-09 对于数据的平均值处理
2020-03-09 文字替换成函数返回数字进行排序
2020-03-09 校验
2020-03-09 Python:使用lambda对列表(list)和字典(dict)排序
2020-03-09 python中的数据排序