当前位置: 首页 > 知识库问答 >
问题:

有界无锁阻塞队列吗

白嘉石
2023-03-14

目前我们有LinkedBlockingQueue和Con的LinkedQueue。

LinkedBlockingQueue可以有界,但它使用锁。

ConcurrentLinkedQueue不使用锁,但它不受限制。而这并不是阻碍投票的原因。

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

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

我听说过LMAX Disruptor,但它看起来根本不像队列。

我也很高兴知道非通用解决方案(单生产者单消费者,SPMC,MPSC)

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

共有1个答案

傅涵忍
2023-03-14

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

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

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

 类似资料:
  • 这是为编写的: 有界队列。当与有限的maximumPoolSizes一起使用时,有界队列(例如ArrayBlockingQueue)有助于防止资源耗尽,但可能更难调优和控制。队列大小和最大池大小可以相互权衡:使用大队列和小池可以最大限度地减少CPU使用量、OS资源和上下文切换开销,但可能会导致人为的低吞吐量。如果任务经常阻塞(例如,如果它们是I/O绑定的),系统可能能够为更多的线程安排时间,而不是

  • 问题内容: 我在一个非常简单的生产者-消费者场景中使用 java.util.concurrent.BlockingQueue 。例如,此伪代码描述了使用者部分: 到目前为止,一切都很好。在阻塞队列的javadoc中,我读到: BlockingQueue本质上不支持任何类型的“关闭”或“关闭”操作,以指示将不再添加任何项目。这些功能的需求和使用往往取决于实现。例如,一种常见的策略是让生产者插入特殊的

  • blpop key1...keyN timeout 从左到右扫描返回对第一个非空list进行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对ke

  • 我编写了一个简单的类,我计划将其扩展为客户端套接字编程应用程序的一部分。类涉及一个BlockingQueue(我从这里复制了代码:相当于Java的BlockingQueue的C++)。当我创建了下面的包装类的一个实例后,我打算让它生成一个单独的线程,该线程只需执行BlockingQueue上阻塞的printer()函数,直到有一个或多个字符串可用,然后它只需将字符串打印到控制台窗口。在我的预期应用

  • 下面是两种主要的方法。 代码:

  • 我有一个应用程序,在其中按下开始按钮后,服务将开始轮询几个传感器,每当传感器值发生变化时,将传感器数据存储到某个对象中。每10毫秒,就会发生一次数据库插入,获取对象的当前值并将其存储到数据库中。这会发生30分钟 考虑到插入的速度和持续时间,我想在一个独立于UI线程的线程中运行它,这样导航就不会受到影响。因此,我的服务将通过将数据添加到队列中来为线程提供一些数据,然后另一个线程(消费者)将从队列中取