Java 队列

1 篇文章 0 订阅

一、ArrayBlockingQueue

基于 ReentrantLock 的有界阻塞队列,支持公平锁

ArrayBlockingQueue 维护了一把全局锁,无论是出队还是入队,都共用这把锁,这就导致任一时间点只有一个线程能够执行。那么对于 “生产者-消费者” 模式来说,意味着生产者和消费者不能并发执行,可能出现性能瓶颈

二、DelayQueue

DelayQueue 是一个无界阻塞队列,用于放置实现了 Delayed 接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。不能将 null 元素放到 DelayQueue 中

三、LinkedBlockingDeque

LinkedBlockingQueue 类似,提供了队列两端操作的方法

四、LinkedBlockingQueue

近似有界阻塞队列,容量大小默认为 Integer.MAX_VALUE

LinkedBlockingQueue 维护了两把锁:takeLockputLocktakeLock 用于控制出队的并发,putLock 用于入队的并发。这也就意味着,同一时刻,只能只有一个线程能执行入队/出队操作,其余入队/出队线程会被阻塞;但是,入队和出队之间可以并发执行,即同一时刻,可以同时有一个线程进行入队,另一个线程进行出队,这中设计可以提高吞吐量

五、LinkedTransferQueue

六、PriorityBlockingQueue

无解阻塞队列,容量大小默认为 Integer.MAX_VALUE,底层是基于数组实现的堆结构

PriorityBlockingQueue 的特点:

  1. PriorityBlockingQueue 与之前介绍的阻塞队列最大的不同之处在于它是一种 优先级队列,也就是说元素并不是以 FIFO 的方式出/入队,而是以按照权重大小的顺序出队
  2. PriorityBlockingQueue 是真正的无界队列(仅受内存大小限制),它不像 ArrayBlockingQueue 那样构造时必须指定最大容量,也不像 LinkedBlockingQueue 默认容量为 Integer.MAX_VALUE
  3. 由于 PriorityBlockingQueue 是按照元素的权重进入排序,所以队列中的元素必须是可以比较的,也就是说元素必须实现 Comparable 接口
  4. 由于 PriorityBlockingQueue 无界队列,所以插入元素永远不会阻塞线程

七、SynchronousQueue

SynchronousQueue 是一个没有数据缓冲的阻塞队列,生产者线程对其的插入操作 put 必须等待消费者的移除操作 take,反过来也一样

八、ConcurrentLinkedDeque

基于 CAS 的无锁、无界、非阻塞队列,适用于多消费者模式。和 ConcurrentLinkedQueue 类似,提供了队列两端操作的方法

九、ConcurrentLinkedQueue

基于 CAS 的无锁、无界、非阻塞队列,适用于多消费者模式

总结

队列阻塞有界线程安全实现原理数据结构使用场景特点
ArrayBlockingQueue阻塞有界基于 ReentrantLock,队列出入队操作只维护一把锁数组生产者-消费者模式1 对于高并发场景,由于生产者-消费者共用一把锁,可能出现性能瓶颈
2 控制对象的内部锁是否采用公平锁,默认采用非公平锁
LinkedBlockingDeque阻塞有界基于 ReentrantLock双向链表单/多生产者-单消费者模式
2 默认链表长度为 Integer.MAX_VALUE,如果生产速度大于消费速度,会将系统内存耗尽
LinkedBlockingQueue阻塞有界基于 ReentrantLock,LinkedBlockingQueue 维护了两把锁:takeLockputLocktakeLock 用于控制出队的并发,putLock 用于入队的并发链表单/多生产者-单消费者模式1 可以同时进行出队和入队操作,有效提升吞吐量
2 默认链表长度为 Integer.MAX_VALUE,如果生产速度大于消费速度,会将系统内存耗尽
LinkedTransferQueue阻塞有界
ConcurrentLinkedDeque非阻塞无界基于 CAS、基于 VarHandler(JDK 9 +)单/多生产者-多消费者模式
ConcurrentLinkedQueue非阻塞无界基于 CAS、基于 VarHandler(JDK 9 +)单/多生产者-多消费者模式
DelayQueue
PriorityBlockingQueue基于数组实现的堆
2 默认链表长度为 Integer.MAX_VALUE,如果生产速度大于消费速度,会将系统内存耗尽
SynchronousQueue
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值