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

将第一个元素原子地添加到ConcurrentLinkedQueue

臧弘和
2023-03-14

我想以无原子锁的方式使用ConcurrentLinkedQueue:

几个并发线程将事件推送到队列中,其他一些线程将处理它们。队列没有绑定,我不希望任何线程等待或被锁定。然而,阅读部分可能会注意到队列变空了。在无锁实现中,读取线程不能阻塞,只能结束其任务并继续执行其他任务(即作为ExecutorService)。因此,将第一个新事件推送到空队列中的写入程序必须知道它,并且应该重新启动读取器(即,通过向ExecutorService提交新的Runnable)来处理队列。任何进一步提交第二个或第三个事件的线程都不会在意,因为它们可能会认为一些读者已经准备好/提交了。

不幸的是,ConTrentLinkedQueue的add()方法总是返回true。在添加事件之前或之后询问队列是否为空()没有帮助,因为它不是原子的。我应该使用一些额外的原子整数来监控队列大小()还是有更聪明的解决方案?

迪特。

共有2个答案

濮阳
2023-03-14

使用原子整数来解决提交争用比锁或同步块更有效。

>

此外,多生产者/单写入者队列的结构也比ConcurrentLinkedQueue更有效。

将其用于actor实现的示例。

另一个例子。

万俟鸿波
2023-03-14

我不太明白你为什么不直接使用ExecutorService。它在内部使用阻塞队列,并负责所有信号本身。

// open ended thread pool
ExecutorService threadPool = Executors.newFixedThreadPool(1);
for (Job job : jobsToDo) {
    threadPool.submit(new MyJobProcessor(job));
}

除非你有充分的理由,否则我不会自己重写同样的逻辑。

如果你想以某种方式利用Hibernate线程,我强烈建议不要费心。线程相对便宜,所以分配一个线程来处理排队的任务是可以的。重复使用线程是不必要的,对我来说似乎是过早的优化。

 类似资料:
  • 我试图创建一个由2x2网格组成的图形,其中每个象限有两个垂直堆叠的子图(即2x1网格)。不过,我似乎不知道如何实现这一点。 我得到的最接近的是使用gridspec和一些丑陋的代码(见下文),但是因为改变了所有子图的行间距,所以我仍然不在我想去的地方。 理想情况下,我想要的是,以下图为例,减少每个象限内子地块之间的间距,同时增加顶部和底部象限之间的垂直间距(即1-3和2-4之间)。 有没有办法做到这

  • 问题内容: 我已经有了一个状态: 现在,我想用新信息对其进行更新。因此,向其添加另一个div。 像这样: 我该怎么做?或者我需要从零开始设置新状态 问题答案: 我认为以组件状态存储jsx组件不是一个好主意。我认为您应该仅以呈现组件所需的状态保存数据。 如果您真的想在状态中存储jsx,为什么不将“对话”属性定义为数组?然后,您可以向其中添加新组件。 但是最好只存储数据,例如“ first”和“ ne

  • 我将ExtendedXmlSerializer与C结合使用,一个已知的限制是添加对象的序列化列表。当这样做时,它会产生一个单独的元素(列表本身),其中包含列表中的项目。由于我正在反序列化来自一个单独应用程序的外部xml,我无法控制xml的布局,因此需要在用C#反序列化xml之前对其进行转换。 我在stackoverflow的其他地方找到的转换在将一种类型的元素添加到一个新的(不存在的)元素中时效果

  • 我有两个列表(列表A和列表B),我希望它们是独立的。因此,我可以将一个元素添加到列表 B,而无需修改 listA 的元素,以保持不变。 试用集合listB=Collections.unmodifiable集合(listA); 跑:[亚历克斯,布莱恩,查尔斯,威廉姆斯] 当我运行它时,我想只显示这些< br >运行:[alex,brian,charles] (没有“williams”)

  • 问题内容: 我有一个numpy数组,其中包含: 我想创建一个包含以下内容的数组: 也就是说,我想将第一个元素添加到数组的末尾。 我尝试了明显的方法: 但我说错了 我不明白这一点-数组都是一维数组。 问题答案: 创建一个新数组,该数组可以是带有附加元素的旧数组。 我认为使用适当的方法添加元素更为正常:

  • 问题内容: 我正在尝试将元素添加到python中的json文件中,但我无法做到这一点。 这是我直到现在尝试的内容(删除了一些变化): 但是,我得到的是: 很好,因为我还需要添加一个新行而不是一个元素,但是我想得到这样的东西: 我应该如何添加新元素? 问题答案: 你可以这样做。