Queue队列

Queue队列,第1张

Queue队列 Queue
    add();//如果队列已满,会抛出错误
    offer();//相当于add,如果队列已满,返回false
    remove();//删除第一个元素,集合为空时调用抛出异常
    poll();//删除第一个元素,集合为空时调用,返回null
    peek();//查询队列头部元素,空时null
    element();//查询队列头元素,空时报错
ConcurrentLinkedQueue 非阻塞队列 BlockingQueue 阻塞队列 使用方法
可能报异常返回布尔值可能阻塞设定等待时间
入队add(e)offer(e)put(e)offer(e, timeout, unit)
出队remove()poll()take()poll(timeout, unit)
查看element()peek()无该方法无该方法
大概对比
队列有界性数据结构
arrayBlockingQueue(阻塞)bounded(有界)加锁ArrayList
LinkedBlockingQueue(阻塞)optional-bounded(可选择的)加锁linkedList
LinkedBlockingDeque(阻塞)optional-bounded(可选择的)加锁linkedList
PriorityBlockingQueue(阻塞)unbounded(无界)加锁heap
DelayQueue(阻塞)unbounded(无界)加锁heap
SynchronousQueue(阻塞)bounded(有界)加锁不知道
LinkedTransferQueue(阻塞,线程安全)unbounded(无界)加锁linkedList
ConcurrentLinkedQueue (非阻塞,线程安全)unbounded(无界)linkedList
名称解释:
  1. 有界无界:指该queue是否为固定最大容量。
  2. FIFO:先进先出,first in first out;
arrayBlockingQueue

用数组实现的有界阻塞队列,FIFO,支持公平锁和非公平锁,默认采用非公平锁。

它内部维护了一个定长数组,以便缓存队列中的数据对象,同时,ArrayBlockingQueue内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。

LinkedBlockingQueue

由链表结构组成的有界阻塞队列:

  1. 当生产者往队列中放入一个数据时,如果队列没满,会将数据缓存在队列内部,而生产者立即返回;
  2. 当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue可以通过构造函数指定该值),会阻塞生产者队列,直到消费者从队列中消费掉一份数据,生产者线程会被唤醒,反之对于消费者这端的处理也基于同样的原理。

LinkedBlockingQueue之所以能够高效的处理并发数据,还因为其对于生产者端和消费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地 *** 作队列中的数据,以此来提高整个队列的并发性能。

注意:

使用LinkedBlockingQueue必须指定最大容量,其默认容量为无限大的Integer.MAX_VALUE,如果生产者生成远远大与消费者,那么系统内存会耗尽。

arrayBlockingQueue和LinkedBlockingQueue区别: arrayBlockingQueue 和 linkBlockingQueue 区别:
  1. arrayBlockingQueue 是定长的,且arr生产者和消费者使用同一个锁对象,生产消费无法并行运行,
  2. arrayBlockingQueue 在插入或删除元素时不会产生或销毁任何额外的对象实例,而linkBlockingQueue 则会生成一个额外的Node对象。在长时间内需要高效并发地处理大批量数据的系统中,gc上会有一定性能差距。
LinkedBlockingDeque:

一个由链表结构组成的双向阻塞队列。队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。LinkedTransferQueue队列多了transfer和tryTransfer方法。

PriorityBlockingQueue

支持线程优先级排序的无界阻塞队列:优先级的判断默认自然序进行排序,也可以构造时传入Compator对象来排序,不会阻塞数据生产者,而只会在没有可供消费的数据时,阻塞数据的消费者;内部控制线程同步的锁采用的是公平锁。

DelayQueue

实现PriorityBlockingQueue的无界延迟队列:当元素指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue是一个无界的队列,因此往队列中插入数据的生产者永远不会被阻塞,而只有获取数据的消费者才会被阻塞。

LinkedTransferQueue

由链表结构组成的无界阻塞队列,实现于TransferQueue:生产者生产时,如果无消费者,它会阻塞,生产者必须要等待消费者消费才会继续生产。

SynchronousQueue

容量为0的阻塞队列,实现于TransferQueue

  1. 每一个put *** 作必须等待take *** 作,这种队列,及时响应度很高,而如果有缓存的队列,吞吐量更高。
  2. 支持公平锁和非公平锁。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/739052.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-28
下一篇2022-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存