同时合并列表 - CopyOnWriteArrayList 或 ConcurrentLinkedQueue 哪个更好?

zhu*_*zhu 2 java concurrency multithreading java.util.concurrent copyonwritearraylist

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

并发链接队列

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

写入数组列表时复制

顾名思义,CopyOnWriteArrayList 使用每个突变操作(例如添加或设置)创建底层 ArrayList 的副本。通常,CopyOnWriteArrayList 非常昂贵,因为它在每次写入操作时都涉及昂贵的数组复制,但如果您有一个迭代次数超过突变的列表,则它非常有效,例如您主要需要迭代 ArrayList 并且不要太频繁地修改它。

tuc*_*uxi 5

ConcurrentLinkedQueue允许您非常高效地编写,无需等待。它会比CopyOnWriteArrayList阅读慢,但也慢不了多少。它将需要更多的空间(周围的指针更少)。

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

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