是否有一个有限的无锁阻塞队列?

时间:2017-09-29 05:35:52

标签: java concurrency

目前我们有LinkedBlockingQueue和ConcurrentLinkedQueue。

LinkedBlockingQueue可以绑定,但它使用锁。

ConcurrentLinkedQueue不使用锁,但它没有限制。并且它不会阻止哪些因素很难进行轮询。

显然我不能拥有一个既阻塞又无锁的队列(无等待或无阻塞或其他东西)。我不要求学术界定义。

有没有人知道一个大部分都是无锁的队列实现(不使用热路径中的锁),空时阻塞(不需要忙等待),并且有界(完全阻塞)?我们也欢迎堆外解决方案。

我听说过LMAX Disruptor,但它看起来并不像是一个队列。

我很高兴知道非一般解决方案(Single-Producer-Single-Consumer,SPMC,MPSC)

如果没有已知的实现,我也很高兴知道可能的算法。

1 个答案:

答案 0 :(得分:1)

无锁数据结构使用原子读写(例如compare-and-swap)来消除锁的需要。当然,这些数据结构永远不会阻塞。

您所描述的是一个使用无锁机制进行非阻塞调用的队列,例如: remove()具有非空队列,而使用锁定来阻止例如空队列上的remove()

您可能会意识到这是不可能实现的。例如,如果您在弹出操作之后,查看该队列是否实际为空,然后继续阻止,则在您阻止时,该队列可能已经有另一个线程插入了一个或多个项目。