【发布时间】:2012-08-02 22:14:53
【问题描述】:
我想以原子lock-free 方式使用ConcurrentLinkedQueue:
几个并发线程将事件推送到队列中,其他一些线程将处理它们。队列未绑定,我不希望任何线程等待或被锁定。然而,阅读部分可能会注意到队列变空了。在无锁实现中,读取线程不能阻塞,而只会结束其任务并继续执行其他任务(即作为 ExecutorService)。因此,将第一个新事件推入空队列的写入者必须意识到它并应该重新启动读取器(即通过向 ExecutorService 提交新的 Runnable)来处理队列。提交第二个或第三个事件的任何其他线程都不会关心,因为它们可能会假设某些读者已经准备好/提交了。
不幸的是,ConcurrentLinkedQueue 的 add() 方法总是返回 true。在添加事件之前或之后询问队列是否 isEmpty() 将无济于事,因为它不是原子的。 我应该使用一些额外的 AtomicInteger 来监控队列大小()还是有一些更智能的解决方案?
迪特。
【问题讨论】:
-
扩展
ConcurrentLinkedQueue,覆盖add()方法,如果需要,让它触发处理器线程。您可能有一个竞争条件,其中两个或多个处理器线程被触发,但它们可以使用同步锁来处理 - 唯一会发生的阻塞是在一个无论如何都会很快死亡的线程上,没有合法的工作线程被阻塞。跨度>
标签: java multithreading concurrency lock-free