并发合并列表 - 哪个更好,CopyOnWriteArrayList或ConcurrentLinkedQueue?

时间:2016-09-19 12:55:23

标签: java multithreading concurrency java.util.concurrent copyonwritearraylist

支持有几个线程在运行查询任务,每个线程都会返回list作为结果,哪个数据结构合并结果会更快?

ConcurrentLinkedQueue

  

基于链接节点的无界线程安全队列。此队列对元素FIFO(先进先出)进行排序。队列的头部是队列中最长时间的元素。队列的尾部是队列中最短时间的元素。新元素插入队列的尾部,队列检索操作获取队列头部的元素。当许多线程共享对公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择。与大多数其他并发集合实现一样,此类不允许使用null元素。   此实施采用高效的"等待免费" Maged M. Michael和Michael L. Scott在“简单,快速,实用的非阻塞和阻塞并发队列算法”中描述的算法

CopyOnWriteArrayList

  

顾名思义,CopyOnWriteArrayList使用每个变异操作创建基础ArrayList的副本,例如:添加或设置。通常CopyOnWriteArrayList是非常昂贵的,因为它涉及每次写入操作的昂贵的阵列复制,但是如果你有一个迭代次数超过变异的List,它会非常有效。你最需要迭代ArrayList而不要经常修改它。

2 个答案:

答案 0 :(得分:3)

ConcurrentLinkedQueue允许您非常有效地编写,无需等待。它会慢于CopyOnWriteArrayList的阅读速度,但不会太多。它需要更多的空间(周围的指针更少)。

CopyOnWriteArrayList稍微紧凑,提供更快的读取,但需要写入完整副本,这是昂贵的。

合并(假设您不关心排序或重复)是一种只写操作,因此您应该选择 ConcurrentLinkedQueue

答案 1 :(得分:2)

如果您的查询任务确实返回列表,那么使用普通的ArrayList将结果合并到一个线程中会快得多。