首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >阻塞队列与生产者消费者模式的经典实现

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

Stack Overflow用户
提问于 2013-11-25 04:19:00
回答 3查看 4.9K关注 0票数 2

我了解到,在实现生产者消费者模式时,我们可以使用BlockingQueue而不是经典的wait()notify()。我的问题是,哪个实施更有效?在一篇关于阻塞队列的文章中,有人写道--“您不需要使用waitnotify在生产者和消费者之间进行通信”

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-26 14:20:30

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

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

  • 使用ArrayBlockingQueue而不是LinkedBlockingQueue:不需要为每个传输的消息创建包装器对象。ArrayBlockingQueue的另一个优点是,如果队列已满,生产者线程就会被阻塞--实际上,如果使用者不快,生产者就应该放慢速度,否则,我们的内存就会耗尽。
  • 将消息分批发送,例如每组10条消息。这减少了共享对象上线程的争用。

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

票数 2
EN

Stack Overflow用户

发布于 2013-11-26 13:26:51

BlockingQueue将更快,因为它为队列访问使用而不是,使用等待/通知或同步。所有并发包都使用原子类实现无锁算法。

考虑一个由100个元素组成的队列,1000个线程想要完成他们的工作。通过同步实现,每个元素999线程都需要等待,直到1个线程选择了它的任务。使用无锁算法,100个线程simultaneously会选择它们的任务,而只有其他900个线程需要等待。

票数 4
EN

Stack Overflow用户

发布于 2013-11-25 04:23:58

BlockingQueue只是一个类,它将wait()和notify()放到这种常见的用法中。一般来说,自己动手只是在重新发明轮子,只有当你有很多生产者和消费者,并且你可以以某种特定于你的代码的方式进行优化的时候,你才值得这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20184688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档