【发布时间】:2013-06-27 00:22:45
【问题描述】:
我有多个生产者和单个消费者的情况。 出于性能原因,我不希望消费者处于任何阻塞状态,但由于可以有更多的生产者,如果队列已满,他们应该“阻塞”。
是否有任何队列为我提供此类行为,或者我如何根据需要修改 ArrayBlockingQueue?
【问题讨论】:
-
ArrayBlockingQueue不是最终版本,您可以扩展和覆盖其功能。
我有多个生产者和单个消费者的情况。 出于性能原因,我不希望消费者处于任何阻塞状态,但由于可以有更多的生产者,如果队列已满,他们应该“阻塞”。
是否有任何队列为我提供此类行为,或者我如何根据需要修改 ArrayBlockingQueue?
【问题讨论】:
ArrayBlockingQueue 不是最终版本,您可以扩展和覆盖其功能。
对消费者使用非阻塞ArrayBlockingQueue.poll,对生产者使用阻塞ArrayBlockingQueue.put
【讨论】:
BlockingQueue 的任何实现有什么问题?您的消费者可以调用 peek()poll(),这是非阻塞的,您的生产者可以调用 put(E e),如果队列已满,则阻塞。
更新
如果队列被用于异常密集的任务,那么LMAX's disruptor ring buffer 可能是性能最高的队列结构。
【讨论】:
poll() 的过程中,消费者线程有一种(很小的)可能性会切换上下文,并且在持有锁的同时阻塞其他消费者,但这可能是短暂的.除非您处于 significant 之下(以每秒数十万次队列访问的顺序),否则我不希望它会给您带来问题。如果您正在做一些密集的事情,那么看看 LMAX 的颠覆者:lmax-exchange.github.io/disruptor