我想使用的ConcurrentLinkedQueue在原子无锁方式:
几个并发线程将事件推到队列和一些其他的线程将处理它们。 队列未绑定,我不希望任何线程等待,或者被锁定。 然而,阅读部分可能会注意到队列了空。 在锁免费实现读线程不能阻止反而会刚刚结束其任务并继续执行其他任务(即作为一个ExecutorService)。 因此,笔者力推的第一个新事件到一个空队列必须意识到这件事,应该重新启动阅读器(通过提交新的Runnable到ExecutorService的IE)来处理队列。 任何进一步的线程提交第二次或第三次事件不会在意,因为他们可能认为已经准备/提交了一些读者。
不幸的是, 加()的ConcurrentLinkedQueue的方法总是返回true。 之前或添加在事件发生后,询问队列如果的isEmpty()不会帮助,因为它不是原子。 我应该使用一些额外的AtomicInteger监测队列的大小(),或者是有一些聪明的解决方案?
迪特。