gpt4 book ai didi

java - 以原子方式将第一个元素添加到 ConcurrentLinkedQueue

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:34 26 4
gpt4 key购买 nike

我想使用 ConcurrentLinkedQueue在原子中lock-free方式:

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

不幸的是 add() ConcurrentLinkedQueue 的方法总是返回 true。在添加事件之前或之后询问队列是否有 isEmpty() 将无济于事,因为它不是原子的。我应该使用一些额外的 AtomicInteger 来监视队列 size() 还是有一些更智能的解决方案?

节食者。

最佳答案

我不太明白为什么您不为此直接使用 ExecutorService。它在内部使用 BlockingQueue 并自行处理所有信号。

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

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

如果您试图以某种方式使用 hibernate 线程,我强烈建议您不要费心。线程相对便宜,因此分配一个线程来处理排队的任务很好。重复使用线程是不必要的,对我来说似乎是过早的优化。

关于java - 以原子方式将第一个元素添加到 ConcurrentLinkedQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11654794/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com