阻塞队列都有哪几种,有什么区别?
# 阻塞队列都有哪几种,有什么区别?
java.util.concurrent.BlockingQueue 接口有以下阻塞队列的实现:
FIFO 队列 :LinkedBlockingQueue、ArrayBlockingQueue(固定长度)
优先级队列 :PriorityBlockingQueue
延时队列 : DelayQueue
同步队列 : SynchronousQueue
java.util.concurrent.BlockingQueue提供了阻塞的 take() 和 put() 方法:如果队列为空 take() 将阻塞,直到队列中有内容;如果队列为满 put() 将阻塞,直到队列有空闲位置。
LinkedBlockingQueue | 1.内部是用链表实现的 2.默认容量是 Integer.MAX_VALUE 3.队列中的锁是分离的,其添加采用的是putLock,移除采用的则是takeLock,这样能大大提高队列的吞吐量,也意味着在高并发的情况下生产者和消费者可以并行地操作队列中的数据,以此来提高整个队列的并发性能 4.会生成一个额外的Node对象。这可能在长时间内需要高效并发地处理大批量数据的时,对于GC可能存在较大影响 5.在无界的情况下,可能会造成内存溢出等问题。 |
ArrayBlockingQueue | 1.ArrayBlockingQueue 是最典型的有界队列 2.其内部是用数组存储元素的 3.利用 ReentrantLock 实现线程安全,添加操作和移除操作采用的同一个ReenterLock锁 4.在创建它的时候就需要指定它的容量,之后也不可以再扩容了 5.构造函数中我们同样可以指定是否是公平的 |
PriorityBlockingQueue | 1.无界阻塞队列 2. 支持优先级,可以通过自定义类实现 compareTo() 方法来指定元素排序规则 |
DelayQueue | 1.无界队列 2.放入的元素必须实现 Delayed 接口 3.内部使用了 PriorityQueue 的能力来进行排序 |
SynchronousQueue | 容量为 0,所以没有一个地方来暂存元素,导致每次取数据都要先阻塞,直到有数据被放入;同理,每次放数据的时候也会阻塞,直到有消费者来取 |
编辑 (opens new window)
上次更新: 2022/05/19, 21:26:01