目前我们有LinkedBlockingQueue和ConcurrentLinkedQueue。
LinkedBlockingQueue可以绑定,但它使用锁。
ConcurrentLinkedQueue不使用锁,但它没有限制。并且它不会阻止哪些因素很难进行轮询。
显然我不能拥有一个既阻塞又无锁的队列(无等待或无阻塞或其他东西)。我不要求学术界定义。
有没有人知道一个大部分都是无锁的队列实现(不使用热路径中的锁),空时阻塞(不需要忙等待),并且有界(完全阻塞)?我们也欢迎堆外解决方案。
我听说过LMAX Disruptor,但它看起来并不像是一个队列。
我很高兴知道非一般解决方案(Single-Producer-Single-Consumer,SPMC,MPSC)
如果没有已知的实现,我也很高兴知道可能的算法。
答案 0 :(得分:1)
无锁数据结构使用原子读写(例如compare-and-swap)来消除锁的需要。当然,这些数据结构永远不会阻塞。
您所描述的是一个使用无锁机制进行非阻塞调用的队列,例如: remove()
具有非空队列,而使用锁定来阻止例如空队列上的remove()
。
您可能会意识到这是不可能实现的。例如,如果您在弹出操作之后,查看该队列是否实际为空,然后继续阻止,则在您阻止时,该队列可能已经有另一个线程插入了一个或多个项目。