-
ArrayBlockingQueue
基于数组
的阻塞有界
阻塞队列
-ArrayBlockingQueue 在生产者放入数据和消费者获取数据,都是共用同一个锁
对象,无法并行
-
LinkedBlockingQueue
基于链表
的阻塞有界
队列(但大小默认值为integer.MAX_VALUE)
能够高效的处理并发数据,因为其对于生产者端和消费者端分别采用了独立的锁
来控制数据同步,这也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能
-
DelayQueue
使用优先级队列
实现的延迟无界阻塞队列
DelayQueue 中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue 是一个没有大小限制
的队列,因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费者)才会被阻塞
-
PriorityBlockingQueue
基于优先级队列
的阻塞队列, 支持优先级排序
的无界
阻塞队列
没有大小限制, 不会阻塞数据生产者, 而只会在没有可消费的数据时,阻塞数据的消费者
-
SynchronousQueue
一种无缓冲
的等待队列, 相对于有缓冲的 BlockingQueue 来说,少了一个中间经销商的环节(缓冲区)不存储元素的阻塞队列,也即单个元素的队列
声明一个 SynchronousQueue 有两种不同的方式: 公平模式和非公平模式, 区别:
- 公平模式:SynchronousQueue 会采用
公平锁
,并配合一个 FIFO队列
来阻塞多余的生产者和消费者,从而体系整体的公平策略; - 非公平模式(SynchronousQueue 默认):SynchronousQueue 采用
非公平锁
,同时配合一个 LIFO
队列来管理多余的生产者和消费者
而后一种模式,如果生产者和消费者的处理速度有差距,则很容易出现饥渴
的情况,即可能有某些生产者或者是消费者的数据永远都得不到处理
-
LinkedTransferQueue
由链表
结构组成的无界
阻塞 TransferQueue 队列
预占模式
: 意思就是消费者线程取元素时,如果队列不为空,则直接取走数据,若队列为空,生成一个节(节点元素为 null)入队,消费者线程被等待在这个节点上,生产者线程入队时发现有一个元素为 null 的节点,生产者线程就不入队了,直接就将元素填充到该节点,并唤醒该节点等待的线程,被唤醒的消费者线程取走元素,从调用的方法返回
-
LinkedBlockingDeque
由链表
结构组成的双向
阻塞队列
阻塞有两种情况:
- 插入元素时: 如果当前队列
已满
将会进入阻塞状态,一直等到队列有空的位置时再该元素插入,该操作可以通过设置超时参数
,超时后返回 false 表示操作失败,也可以不设置超时参数一直阻塞,中断后抛出 InterruptedException异常 - 读取元素时: 如果当前队列
为空
会阻塞住直到队列不为空然后返回元素,同样可以通过设置超时参数