BlockingQueue<E>

工作队列BlockingQueue<E>其子类

ArrayBlockingQueue 数组型阻塞队列
LinkedBlockingQueue 链表型阻塞队列
DelayQueue 延时队列
SynchronousQueue 同步队列
PriorityBlockingQueue 优先阻塞队列

ArrayBlockingQueue

public ArrayBlockingQueue(int capacity)
public ArrayBlockingQueue(int capacity, boolean fair)
基于数组的、有界的、遵循FIFO原则的阻塞队列
初始化时必须指定队列大小
入队和出队共用同一个可重入锁,互斥,无法同时入队出队
有界设计,容量已满则无法继续添加元素直至有元素被移除
内存连续片段,在remove时需要移动数据,影响性能

LinkedBlockingQueue

基于链表的、有界的、遵循FIFO原则的阻塞队
puts操作都会生成新的Node对象,takes操作Node对象在某一时间会被GC,可能会影响GC性能
可设定边界,在默认构造方法中容量是Integer.MAX_VALUE
node包含next节点关联,会多占用一点内存
两个重入锁(非公平锁)分别控制元素出队入队,在高并发高吞吐的情况下,性能较好,用Condition进行线程间的唤醒和等待
非连续性内存空间,执行remove操作时,不用移动其他数据

DelayQueue

无边界设计
添加(put)不阻塞,移除(take)阻塞
元素都有一个过期时间,取元素时只有过期的才会被取出

SynchronousQueue

内部容量是0
每次删除操作都要等待插入操作
每次插入操作都要等待删除操作
一个元素,一旦有了插入线程和移除线程,那么很快由插入线程移交给移除线程,这个容器相当于通道,本身不存储元素
在多任务队列,是最快的处理任务方式。

PriorityBlockingQueue

无边界设计,但容量实际是依靠系统资源影响
添加元素,如果超过1,则进入优先级排序

参考资料《ArrayBlockingQueue》
参考资料《Java 并发编程 --- LinkedBlockingQueue与ArrayBlockingQueue (七)》


老污的猫
30 声望5 粉丝