2

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

并发链接队列

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

CopyOnWriteArrayList

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

4

2 回答 2

5

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

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

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

于 2016-09-19T13:01:37.637 回答
2

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

于 2016-09-19T13:07:19.427 回答