Java多生产者多消费者场景下最优性能线程安全队列如何选择?
Java多生产者多消费者场景高性能队列选型参考
首先先明确一个前提:ConcurrentSkipListSet不是队列实现,是有序去重的Set结构,本身不满足队列常规的FIFO语义,如果你只是需要通用队列能力可以直接排除它,仅当你的业务需要有序、去重的特殊消费规则时再考虑。
以下是不同维度的可选方案和性能特点:
JDK内置队列方案
ConcurrentLinkedQueue:无界非阻塞队列,基于CAS实现无锁操作,入队出队时间复杂度都是O(1),内存占用低,多生产者多消费者场景下无锁竞争开销,适合对延迟敏感、队列长度没有固定上限的场景。缺点是不支持阻塞等待逻辑,消费者轮询空队列会产生空转CPU损耗。LinkedBlockingQueue:可选有界/无界阻塞队列,采用读写分离锁实现,入队、出队操作各自持锁,并发性能比读写共用一把锁的ArrayBlockingQueue高30%以上,是业务开发中最常用的阻塞队列实现,缺点是链表节点的内存开销比数组结构高。LinkedTransferQueue:JDK1.7+提供的无界阻塞队列,同时支持直接传输和缓冲存储两种模式,无论有没有等待的消费者,性能都比LinkedBlockingQueue高一倍以上,内存占用也更低,是JDK内置阻塞队列里性能最优的实现。SynchronousQueue:无缓冲阻塞队列,生产的元素必须等待消费者立即消费,没有存储能力,吞吐量极高,适合元素生产后需要立即被消费的场景,Executors.newCachedThreadPool默认就是用这个队列实现。
第三方高性能队列方案
如果JDK内置队列的性能无法满足你的要求,可以考虑工业界广泛验证的高性能开源实现:
- Disruptor:LMAX开源的无锁环形队列,基于内存预分配、缓存行填充、CAS操作实现,吞吐量比JDK内置队列高1~2个数量级,延迟稳定几乎没有波动,没有额外的垃圾回收开销,非常适合低延迟高吞吐的核心业务场景。缺点是属于有界队列,需要提前指定容量,API使用比JDK原生队列稍复杂。
- JCTools并发队列:专门做高并发数据结构的开源库,提供了
MpmcArrayQueue(多生产者多消费者)等多种场景优化的队列实现,性能比JDK同类型队列高50%以上,API完全兼容JDK原生队列规范,迁移成本极低。
选型建议
- 不需要引入第三方依赖的场景:不需要阻塞语义选
ConcurrentLinkedQueue,需要阻塞语义选LinkedTransferQueue - 对性能有极致要求的场景:有界场景优先选Disruptor,兼容JDK API优先选JCTools的
MpmcArrayQueue
内容的提问来源于stack exchange,提问作者user14774749
相关产品推荐
相关产品推荐

