我有一个线程将事件推送到第二个线程的入站队列中,这是一个经典问题。但这次,我非常关心性能。我想要实现以下目标:
- 我需要对队列进行并发访问,生产者推送,接收者弹出。
- 当队列为空时,我希望消费者阻塞在队列上,等待生产者。
我的第一个想法是使用LinkedBlockingQueue
,但我很快意识到它不是并发的,性能受到了影响。另一方面,我现在使用的是ConcurrentLinkedQueue
,但仍然需要在每次发布时支付wait()
/notify()
的成本。由于消费者在发现队列为空时不会阻塞,所以我必须同步并在锁上wait()
。另一方面,生产者必须获得该锁,并在每个单独的发布上notify()
。总体而言,即使不需要,在每个单独的发布中都要支付sycnhronized (lock) {lock.notify()}
的成本。
我猜想这里需要的是既可以阻塞又可以并发的队列。我想象中的push()
操作工作方式与ConcurrentLinkedQueue
相同,当推送的元素是列表中的第一个元素时,会额外发出notify()
。我认为在ConcurrentLinkedQueue
中已经存在这样的检查,因为推送需要连接下一个元素。因此,这比每次在外部锁上同步要快得多。
是否有类似这样的可用/合理的队列?