当前位置: 首页 > 知识库问答 >
问题:

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

乐健
2023-03-14

支持有两个线程运行查询任务,每个线程将返回list作为结果,哪种数据结构将更快地合并结果?

并发链接队列

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

临时工

顾名思义,CopyOnWriteArrayList使用每个变异操作(如add或Set)创建底层ArrayList的副本。通常,CopyOnWriteArrayList非常昂贵,因为它涉及到每一个写操作都要进行昂贵的数组复制,但如果您有一个迭代数大于变异数的列表,那么它就非常有效,例如,您通常需要迭代ArrayList并且不要经常修改它。

共有1个答案

骆照
2023-03-14

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

copyonwritearraylist稍微紧凑一些,提供更快的读取速度,但在写入时需要完整的副本,这是昂贵的。

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

 类似资料:
  • (注意这不是按字母顺序,蓝莓排在狒狒之前) 当然,只要有一个列表不是空的,我就可以用一个计数器在“superlist”中循环,一个接一个地向resultslist中添加项目: 但最好使用一些优化的LINQ函数来实现这一点。我一直在研究Zip、GroupBy和Aggregate,但无法使它们工作。 那么:有没有一个漂亮的LINQ函数,或者多个函数的组合,可以把它变成漂亮的代码,或者我应该坚持(也许优

  • rank ▲ ✰ vote url 65 357 50 683 url 合并两个列表 怎样合并两个列表? 例如: listone = [1,2,3] listtwo = [4,5,6] 我期待: mergedlist == [1, 2, 3, 4, 5, 6] 在Python中非常容易. mergedlist = listone + listtwo

  • 问题内容: 如果知道只有两个值可以候选列的结果, 和 将给出相同的结果。但是哪个更快?搜索时,我发现了这篇文章,说 ifnull 更快。但这是我发现的唯一文章。有什么看法吗? 提前致谢 :) 问题答案: 我的观点是您应该对使用情况进行基准测试。 我怀疑会有很大的不同。请记住,虽然一个基准可能暗示一个基准稍好一些,但随着时间的推移数据变化可能会改变结果。 还要注意,COALESCE自1992年以来就

  • 问题内容: 我想将3个列表合并到一个列表中。例如,我有三个列表: 最后我想得到 出,, 有没有更快的方法来合并这三个列表?这是我的代码: 问题答案:

  • 问题内容: 我正在写一个小脚本来帮助日本假名记忆。我如何将以下列表合并为一个?我尝试如下。 问题答案: 单程:

  • Java8在收集器中提供了一个groupingBy函数,但它给出了元素的映射。我需要把地图转换成单个列表。 它还返回结果,但我想要的是对列表本身执行分组操作,这样我就不必重新分配它,因为在lambda表达式中不可能重新分配。 但是nodelistgrouped.values()返回Collection(List)