Java 是否存在有界无锁阻塞队列?

Java 是否存在有界无锁阻塞队列?,java,concurrency,Java,Concurrency,目前我们有LinkedBlockingQueue和ConcurrentLinkedQueue LinkedBlockingQueue可以是有界的,但它使用锁 ConcurrentLinkedQueue不使用锁,但它不是有界的。而且,正是因为没有封锁,所以很难进行投票 显然,我不能有一个既阻塞又无锁(无等待、无阻塞或其他)的队列。我不要求学术上的定义 有人知道一种队列实现,它主要是无锁的(不在热路径中使用锁),空时阻塞(不需要忙着等待),有界的(满时阻塞)?堆外解决方案也很受欢迎 我听说了LMAX

目前我们有LinkedBlockingQueue和ConcurrentLinkedQueue

LinkedBlockingQueue可以是有界的,但它使用锁

ConcurrentLinkedQueue不使用锁,但它不是有界的。而且,正是因为没有封锁,所以很难进行投票

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

有人知道一种队列实现,它主要是无锁的(不在热路径中使用锁),空时阻塞(不需要忙着等待),有界的(满时阻塞)?堆外解决方案也很受欢迎

我听说了LMAX干扰器,但它看起来根本不像一个队列

我也很高兴了解非通用解决方案(单生产商单消费者、SPMC、MPSC)


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

无锁数据结构使用原子读写(例如)来消除对锁的需要。当然,这些数据结构从不阻塞

您所描述的是一个队列,该队列使用无锁机制进行非阻塞调用,例如使用非空队列的
remove()
,而使用锁进行阻塞,例如使用空队列的
remove()


正如您可能意识到的,这是不可能实现的。例如,如果要在执行pop操作后查看队列是否确实为空,然后继续执行阻止,则在阻止时,队列可能已经有一个或多个项目由另一个线程插入。

如果您描述了问题域,可能会使此问题更“不可关闭”。现在您只需要请求一个外部资源。JDK没有提供一个队列实现,(1)大部分是无锁的,(2)不需要忙等待,(3)有界的。LinkedBlockingQueue和ArrayBlockingQueue满足(2)和(3),ConcurrentLinkedQueue仅满足(1)。我想要的是一个符合所有条件的队列。如果没有实现,也欢迎提供算法描述。根据LMAX,disruptor ring buffer似乎满足所有要求,但它看起来不像队列,而且我相信底层算法可能很难实现队列。我想解释一下您使用的是哪种域。在您的问题中,对性能队列的要求是明确的。至于LMAX disruptor,您需要以更广泛的方式将其整合到您的体系结构中。毕竟,这并不是取代
队列的捷径。我要问的是一个非常具体的问题。即具有某些活性属性的队列。这就像,有没有可能问,有没有可能用O(n)对列表进行排序,或者有没有一个库可以用O(n)对列表进行排序并且易于使用。我说过一定有吗?如果你知道有一个问题,那么这个问题不是没有用的,因为我们知道我们可以做些什么。如果你知道这是不可能的(即自相矛盾的),那么证明它,这个问题也不是没有用的,因为现在我们知道我们不能做什么。你要求的是外部资源,这是结束一个问题的基础之一(如果你看不到,目前有3票接近)。你也使得以否定的方式回答这个问题变得非常不可能,因为“不,没有这样的队列”将是一个相当大胆的说法。你不能接受你问了一个糟糕的问题,然后继续前进吗?如果我处在你的位置,我会在网上搜索而不是一对一地搜索。注意:您可以问“是否可以按O(n)排序”,但要求库这样做是离题的。是的,我认为如果队列中剩余(接近)0个项目,则线程可以阻塞是完全合理的,显然,当队列(接近)满时,同样的情况也适用。我只是不认为在快速通道上有任何潜在的阻塞操作。或者确实有一些不可能的原因?例如,在单生产者单消费者的情况下,生产者和消费者可能可以更新自己的指针,并且不会相互影响(在快速路径中)?