我有一个线程将事件推送到第二个线程的传入队列的经典问题。只是这一次,我对性能很感兴趣。我想要实现的是:
- 我想要同时访问队列,生产者推送,接收者弹出。
- 当队列为空时,我希望消费者阻塞到队列中,等待生产者。
我的第一个想法是使用 a LinkedBlockingQueue
,但我很快意识到它不是并发的并且性能受到影响。另一方面,我现在使用 a ,但我仍然为每个出版物ConcurrentLinkedQueue
支付wait()
/的费用。notify()
由于消费者在找到一个空队列后不会阻塞,因此我必须同步并wait()
锁定。另一方面,制作人必须notify()
在每次发布时都获得该锁定。总体结果是
sycnhronized (lock) {lock.notify()}
,即使在不需要的时候,我也要为每一个出版物支付费用。
我猜这里需要的是一个既阻塞又并发的队列。我想象一个push()
操作可以像 in 一样工作,当推送的元素是列表中的第一个时,对象会有ConcurrentLinkedQueue
一个额外的内容。notify()
我认为这样的检查已经存在于 中ConcurrentLinkedQueue
,因为推送需要连接下一个元素。因此,这将比每次在外部锁上同步要快得多。
这样的事情可用/合理吗?