蜘蛛侠鲍里斯(Boris the
Spider)已经概述了
ArrayBlockingQueue和之间最明显的区别
linkedBlockingQueue-前者始终是有界的,而后者可以是无界的。
因此,如果您需要无限制的阻塞队列,
linkedBlockingQueue或者将其
linkedTransferQueue用作工具箱
BlockingQueue中的最佳选择
java.util.concurrent。
但是,假设您需要一个有限的阻塞队列。最后,您应该基于对真实工作负载进行模拟的广泛实验来选择一种实现。不过,以下是一些注释,可以帮助您进行选择或解释实验结果:
ArrayBlockingQueue
可以使用可配置(开/关)调度公平性策略创建。如果您需要公平或希望避免生产者/消费者饥饿,那么这很好,但是这会浪费您的吞吐量。ArrayBlockingQueue
预分配其后备数组,因此它在使用过程中不会分配节点,但会立即占用相当大的内存块,如果您的内存碎片化,则可能会出现问题。ArrayBlockingQueue
应该具有较小的性能差异,因为它总体上具有较少的运动部件,它使用了一种更简单且不太复杂的单锁算法,在使用过程中不创建节点,并且其缓存行为应相当一致。linkedBlockingQueue
应该具有更好的吞吐量,因为它为头部和尾部使用了单独的锁。linkedBlockingQueue
不会预分配节点,这意味着它的内存占用空间将大致与其大小匹配,但这也意味着它将为分配和释放节点带来一些工作。linkedBlockingQueue
缓存行为可能更糟,这可能会影响其自身的性能,还可能由于错误共享而影响其他组件的性能。
根据您的使用情况,并做了多少你关心性能,你可能还需要的外观之外
java.util.concurrent,并考虑干扰物(一个非常快,但有些专门界无阻塞环形缓冲区)或JCTools(各种界或无界根据生产者和消费者的数量,具有不同保证的队列)。



