第一元素添加到的ConcurrentLinkedQueue原子(Add the first elem

2019-09-20 04:55发布

我想使用的ConcurrentLinkedQueue在原子无锁方式:

几个并发线程将事件推到队列和一些其他的线程将处理它们。 队列未绑定,我不希望任何线程等待,或者被锁定。 然而,阅读部分可能会注意到队列了空。 在锁免费实现读线程不能阻止反而会刚刚结束其任务并继续执行其他任务(即作为一个ExecutorService)。 因此,笔者力推的第一个新事件到一个空队列必须意识到这件事,应该重新启动阅读器(通过提交新的Runnable到ExecutorService的IE)来处理队列。 任何进一步的线程提交第二次或第三次事件不会在意,因为他们可能认为已经准备/提交了一些读者。

不幸的是, 加()的ConcurrentLinkedQueue的方法总是返回true。 之前或添加在事件发生后,询问队列如果的isEmpty()不会帮助,因为它不是原子。 我应该使用一些额外的AtomicInteger监测队列的大小(),或者是有一些聪明的解决方案?

迪特。

Answer 1:

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

  • 下面是一个例子,如何可以使用Java来实现 。

  • 也有用于多生产者/单写队列更有效的结构比的ConcurrentLinkedQueue。

  • 使用它的演员实现的实施例 。

  • 另一个例子 。



Answer 2:

我不明白为什么你不直接使用的ExecutorService直接这一点。 它采用了BlockingQueue内部,并采取所有信令本身的照顾。

// open ended thread pool
ExecutorService threadPool = Executors.newFixedThreadPool(1);
for (Job job : jobsToDo) {
    threadPool.submit(new MyJobProcessor(job));
}

除非你有很好的理由,我也不会自己重写相同的逻辑。

如果你想利用休眠线程不知何故,我会强烈建议不要打扰。 线程是相对便宜,所以分配一个线程来处理你排队的任务是罚款。 重新使用线程是不必要的,似乎是不成熟的优化给我。



文章来源: Add the first element to a ConcurrentLinkedQueue atomically