【问题标题】:For producer-consumer pattern which implementation is better : ArrayBlockingQueue or Arraylists with Exchangers对于生产者-消费者模式,哪种实现更好:ArrayBlockingQueue 或 Arraylists with Exchangers
【发布时间】:2015-06-02 07:30:59
【问题描述】:

用例

它是一种生产者消费者模式,需要维护订单(FIFO)。目前只有一个生产者和一个消费者来按顺序处理数据以维持秩序,但未来(由于消除了一些业务约束)这种维持秩序的需求将不再存在。届时,我们将能够创建多个生产者和消费者在同一个队列上工作。

我可以看到两种解决方案

我可以使用在生产者和消费者之间实现数据管道 a) ArrayBlockingQueue b) 可以使用Exchangers,并使用两个ArrayLists作为底层数据结构

问题

这两种实现在并发方面的相对优缺点是什么?

我的想法

我认为 Exchangers 在并发方面会更好,因为线程在不同的 ArrayList 上进行读写,但缺点是生产者可能必须等到消费者的 arraylist 已满并且可以交换。

提前感谢您分享您的观点。

【问题讨论】:

    标签: java concurrency producer-consumer


    【解决方案1】:

    绝不是 ArrayBlockingQueue 更好。使用 Exchanger 时,通信线程之一总是会被阻塞,而使用 ArrayBlockingQueue,阻塞只会发生在生产者和消费者的速度不平衡。

    使用 ArrayLists 可以减少争用,也可以与 ArrayBlockingQueue 一起使用。

    更新

    Exchanger.exchange() 等待另一个线程到达这个交换点......然后将给定的对象传输给它,作为回报接收它的对象。

    也就是说,第一个到达同步点的线程总是等待。当使用 ArrayBlockingQueue 时,生产者和消费者之间的流量是平衡的,没有一个线程等待。

    【讨论】:

    • 谢谢阿列克谢。您能否详细说明“一个通信线程将始终被阻塞”。
    • 如果速度完全匹配,我知道 ArrayBlockingQueue 更好,因为不会像 Exchanger 中那样有任何数据库交换开销。但是完美的速度平衡很少见,通常速度会略有不同。在速度不同的情况下,BlockingQueue 会让生产者/消费者等待每条消息,而交换器每批只做一次,但等待时间会更长(直到对方准备好交换)。
    • 正如我所说,ArrayBlockingQueue 也可以进行批量处理。这是一个正交问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-26
    • 2018-10-10
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多