目前我们有LinkedBlockingQueue和ConcurrentLinkedQueue。
LinkedBlockingQueue可以是有界的,但它使用锁。
ConcurrentLinkedQueue不使用锁,但它不是有界的。而且它不会阻塞,这使得它很难轮询。
显然,我不能让一个既阻塞又无锁的队列(等待自由或非阻塞或其他)。我不要求学术上的定义。
有没有人知道一个队列实现,它基本上是无锁的(不在热路径中使用锁),在空的时候阻塞(不需要忙碌等待),并且是有界的(满的时候阻塞)?堆外解决方案也是受欢迎的。
我听说过LMAX Disruptor,但它看起来一点也不像队列。
我也很高兴知道非通用的解决方案(单生产者-单消费者,SPMC,MPSC)
如果没有已知的实现,我也很高兴知道可能的算法。
发布于 2017-09-30 01:41:56
无锁数据结构使用原子读写(例如compare-and-swap)来消除对锁的需求。当然,这些数据结构从不阻塞。
你所描述的是一个队列,它对非阻塞调用使用无锁机制,例如非空队列的remove()
,而对空队列的remove()
使用锁来阻塞。
正如您可能意识到的,这是不可能实现的。例如,如果在弹出操作之后,查看队列是否实际上是空的,然后继续阻塞,当您阻塞时,队列可能已经有一个或多个项目由另一个线程插入。
https://stackoverflow.com/questions/46482378
复制相似问题