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更高
posted on 2023-03-09 21:39  共感的艺术  阅读(16)  评论(0编辑  收藏  举报