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

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

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

迪特。

最佳答案

使用 AtomicInteger 解决提交争用比锁或 synchronized 块更有效。

  • 这是 an example how it can be implemented with Java
  • 还有 more efficient structure for multi-producer / single-writer queue 比 ConcurrentLinkedQueue。
  • Example of using it for actor implementations
  • Another example
  • 关于java - 以原子方式将第一个元素添加到 ConcurrentLinkedQueue,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11654794/

    10-13 02:39