阻塞队列与生产者消费者模式的经典实现

时间:2013-11-25 04:19:00

标签: java multithreading design-patterns

我知道在实现Producer Consumer模式时,我们可以使用BlockingQueue而不是经典wait()notify()。我的问题是,哪种实施更有效?在一篇关于阻止队列的文章中,有人写道:“你不需要使用waitnotify来在制作人和消费者之间进行交流”

阅读更多:http://javarevisited.blogspot.com/2012/02/producer-consumer-design-pattern-with.html#ixzz2lczIZ3Mo“。这种简单性是否会以效率为代价?

3 个答案:

答案 0 :(得分:4)

BlockingQueue会更快,因为使用wait / notify或synchronized来进行队列访问。所有并发包都使用Atomic-classes实现无锁算法。

考虑一个包含100个元素的队列,以及1000个想要完成工作的线程。通过同步实现,每个元素999线程需要等待,直到1个线程已经选择了它的任务。使用无锁算法,100个线程同时选择他们的任务,只有其他900个必须等待。

答案 1 :(得分:2)

BlockingQueue只是一个将wait()和notify()放入此常用的类。一般来说,自己动手只是重新发明轮子,只有拥有大量生产者和消费者才有价值,并且你可以通过某种特定于代码的方式进行优化。

答案 2 :(得分:2)

如果每秒产生/消耗的对象数量少于100000,那么您将无法看到标准或自己实现的差异。

否则,您可以使用以下选项来加速代码:

  • 使用ArrayBlockingQueue而不是LinkedBlockingQueue:无需为每个传输的消息创建包装器对象。 ArrayBlockingQueue的另一个优点是,如果队列已满,生产者线程将被阻止 - 实际上,如果消费者不快,生产者应该减速,否则,我们最终会耗尽内存。

  • 批量发送消息,比如每个包含10条消息的数组。这减少了共享对象上线程的争用。

如果您每秒必须发送数千万条消息,请查看Lmax Disruptor