我知道在实现Producer Consumer模式时,我们可以使用BlockingQueue
而不是经典wait()
和notify()
。我的问题是,哪种实施更有效?在一篇关于阻止队列的文章中,有人写道:“你不需要使用wait
和notify
来在制作人和消费者之间进行交流”
阅读更多:http://javarevisited.blogspot.com/2012/02/producer-consumer-design-pattern-with.html#ixzz2lczIZ3Mo“。这种简单性是否会以效率为代价?
答案 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。