对于生产者-消费者模式,哪个实现更好:ArrayBlockingQueue 或 Arraylists with Exchangers
For producer-consumer pattern which implementation is better : ArrayBlockingQueue or Arraylists with Exchangers
用例 :
它是一种生产者消费者模式,其中要维护顺序 (FIFO)。目前只有单个生产者和单个消费者按顺序处理数据以维持秩序,但在未来(由于某些业务约束的去除)将不再存在维持秩序的需求。届时,我们将能够在同一个队列上创建多个生产者和消费者。
我可以看到两个解决方案 :
我可以使用以下方法实现生产者和消费者之间的数据管道
a) ArrayBlockingQueue
b) 可以使用Exchangers并使用两个ArrayLists作为底层数据结构
问题:
这两种实现在并发性方面的相对优缺点是什么?
我的想法:
我认为交换器在并发性方面会更好,因为线程在不同的 ArrayLists 上读写,但缺点是生产者可能必须等到消费者的数组列表已满才能交换。
提前感谢分享您的观点。
绝对不是,ArrayBlockingQueue 更好。使用交换器时,其中一个通信线程总是会被阻塞,而使用 ArrayBlockingQueue,阻塞只会发生在生产者和消费者速度不平衡的情况下。
使用 ArrayLists 可以减少争用,也可以与 ArrayBlockingQueue 一起使用。
更新
Exchanger.exchange()
等待另一个线程到达这个交换点...然后将给定的对象传递给它,在return.
中接收它的对象
即第一个到达同步点的线程总是等待。当使用 ArrayBlockingQueue 时,生产者和消费者的流量是平衡的,没有一个线程等待。
用例 :
它是一种生产者消费者模式,其中要维护顺序 (FIFO)。目前只有单个生产者和单个消费者按顺序处理数据以维持秩序,但在未来(由于某些业务约束的去除)将不再存在维持秩序的需求。届时,我们将能够在同一个队列上创建多个生产者和消费者。
我可以看到两个解决方案 :
我可以使用以下方法实现生产者和消费者之间的数据管道 a) ArrayBlockingQueue b) 可以使用Exchangers并使用两个ArrayLists作为底层数据结构
问题:
这两种实现在并发性方面的相对优缺点是什么?
我的想法:
我认为交换器在并发性方面会更好,因为线程在不同的 ArrayLists 上读写,但缺点是生产者可能必须等到消费者的数组列表已满才能交换。
提前感谢分享您的观点。
绝对不是,ArrayBlockingQueue 更好。使用交换器时,其中一个通信线程总是会被阻塞,而使用 ArrayBlockingQueue,阻塞只会发生在生产者和消费者速度不平衡的情况下。
使用 ArrayLists 可以减少争用,也可以与 ArrayBlockingQueue 一起使用。
更新
Exchanger.exchange() 等待另一个线程到达这个交换点...然后将给定的对象传递给它,在return.
中接收它的对象即第一个到达同步点的线程总是等待。当使用 ArrayBlockingQueue 时,生产者和消费者的流量是平衡的,没有一个线程等待。