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

标签 java multithreading concurrency lock-free

我想使用 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/

相关文章:

JavaFX8 后台线程仍然干扰 GUI

从 Synchronized block 调用 Java 方法

c# - Monitor 与基于 WaitHandle 的线程同步

java - Java 7 fork/join 是否保证在单独的 CPU 中执行线程

java - 在 res 文件夹下找不到文件夹和变量

java - 将给定的 String 转换为 Date 对象

当在进程内创建父对象时,Python 多线程不使用公共(public)内存

multithreading - 多线程haskell的优雅退出

java - 如果任何请求在 tomcat 线程池中创建更多线程怎么办

java - Frog Cross River - 改进使用的数据结构