我想以原子无锁方式使用ConcurrentLinkedQueue:
几个并发线程将事件推送到队列中,其他一些线程将处理它们。队列未绑定,我不希望任何线程等待或被锁定。然而,阅读部分可能会注意到队列变空了。在无锁实现中,读取线程不能阻塞,而只会结束其任务并继续执行其他任务(即作为 ExecutorService)。因此,将第一个新事件推入空队列的写入者必须意识到它并应该重新启动读取器(即通过向 ExecutorService 提交新的 Runnable)来处理队列。提交第二个或第三个事件的任何其他线程都不会关心,因为它们可能会假设某些读者已经准备/提交。
不幸的是,ConcurrentLinkedQueue 的add()方法总是返回 true。在添加事件之前或之后询问队列是否 isEmpty() 将无济于事,因为它不是原子的。我应该使用一些额外的 AtomicInteger 来监控队列大小()还是有一些更智能的解决方案?
迪特。