Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并发合并列表-CopyOnWriteArrayList和ConcurrentLinkedQueue哪个更好?_Java_Multithreading_Concurrency_Java.util.concurrent_Copyonwritearraylist - Fatal编程技术网

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

Java 并发合并列表-CopyOnWriteArrayList和ConcurrentLinkedQueue哪个更好?,java,multithreading,concurrency,java.util.concurrent,copyonwritearraylist,Java,Multithreading,Concurrency,Java.util.concurrent,Copyonwritearraylist,支持有两个线程运行查询任务,每个线程将返回一个列表作为结果,哪个数据结构将更快地合并结果 基于链接节点的无限线程安全队列。此队列对元素进行FIFO先进先出排序。队列的头是在队列上停留时间最长的元素。队列的尾部是在队列上停留时间最短的元素。新元素插入到队列的尾部,队列检索操作获取队列头部的元素。当许多线程将共享对公共集合的访问时,ConcurrentLinkedQueue是一个合适的选择。与大多数其他并发集合实现一样,此类不允许使用null元素。 该实现采用了一种高效的无等待算法,该算法基于Mag

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

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

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

ConcurrentLinkedQueue允许您高效地进行写操作,无需等待。它的阅读速度将比CopyOnWriteArrayList慢,但不会慢很多。它需要稍微多一些无空间指针

CopyOnWriteArrayList稍微紧凑一些,可以提供更快的读取速度,但在写入时需要完整副本,这非常昂贵

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

ConcurrentLinkedQueue允许您非常高效地进行写入、无需等待。它的阅读速度将比CopyOnWriteArrayList慢,但不会慢很多。它需要稍微多一些无空间指针

CopyOnWriteArrayList稍微紧凑一些,可以提供更快的读取速度,但在写入时需要完整副本,这非常昂贵



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

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

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

您认为呢?多个线程将其输出合并到共享数据结构中的整个方法是有缺陷的。最优系统永远不会这样做;相反,它们有一个下游线程,该线程通过并发队列接受来自多个线程的部分结果,然后在单个批处理操作中合并。为什么需要一个并发数据结构来合并@MarkoTopolnik建议的那些列表?通过返回城市子列表并合并到getCityListByIds方法中的简单ArrayList,可以节省并发访问的时间。与CopyOnWriteList实现相比,它还将浪费更少的内存。是的,您可以从Futures收集所有部分结果,并将它们合并到发起查询的线程中。请签出ExecutorCompletionService,您可以在结果准备好后立即收集结果,都在主线程中。你认为呢?多个线程将其输出合并到一个共享数据结构的整个方法是有缺陷的。最优系统永远不会这样做;相反,它们有一个下游线程,该线程通过并发队列接受来自多个线程的部分结果,然后在单个批处理操作中合并。为什么需要一个并发数据结构来合并@MarkoTopolnik建议的那些列表?通过返回城市子列表并合并到getCityListByIds方法中的简单ArrayList,可以节省并发访问的时间。与CopyOnWriteList实现相比,它还将浪费更少的内存。是的,您可以从Futures收集所有部分结果,并将它们合并到发起查询的线程中。请签出ExecutorCompletionService,您可以在结果准备好后立即收集结果,我知道这些线程试图同时填充一个结果list@tucuxi每个任务都会返回一个列表作为结果。我知道线程试图同时填充一个结果list@tucuxi每个任务将返回一个列表作为结果。是,我不在乎订购或复制。我只是阅读CopyOnWriteArrayList的源代码。是的,它需要写完整的副本。但是,当我们复制列表时,我们将使用addAll方法,该方法将使用System.arraycopy API在阵列上执行批复制,这非常有效
是的,我不在乎订购或复制。我只是读了CopyOnWriteArrayList的源代码。是的,它需要写完整的副本。但是,当我们复制列表时,我们将使用addAll方法,该方法将使用System.arraycopy API在阵列上执行批复制,这是非常有效的。