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数据结构_Java_Multithreading_Performance_Data Structures_Concurrency - Fatal编程技术网

用于快速并发插入的最佳Java数据结构

用于快速并发插入的最佳Java数据结构,java,multithreading,performance,data-structures,concurrency,Java,Multithreading,Performance,Data Structures,Concurrency,我的用例如下:我有10个线程同时写入一个数据结构。数据结构中元素的顺序并不重要。所有元素都是独一无二的。我将只在最后一次读取这个数据结构 适合此目的的最快本机Java数据结构是什么?从我的阅读来看,似乎是集合。synchronizedList可能是“转到”选项?没有必要在列表上同步,因为每个线程都可以处理其本地副本,最后可以将所有线程的结果合并到一个最终列表中 如果我打算使用JDK7和更高版本,那么我将使用fork和join,在每个fork任务中创建简单的List,最后在join阶段的末尾将其加

我的用例如下:我有10个线程同时写入一个数据结构。数据结构中元素的顺序并不重要。所有元素都是独一无二的。我将只在最后一次读取这个数据结构


适合此目的的最快本机Java数据结构是什么?从我的阅读来看,似乎是
集合。synchronizedList
可能是“转到”选项?

没有必要在列表上同步,因为每个线程都可以处理其本地副本,最后可以将所有线程的结果合并到一个最终列表中

如果我打算使用JDK7和更高版本,那么我将使用fork和join,在每个fork任务中创建简单的
List
,最后在join阶段的末尾将其加入到主列表中

如果我在JDK6上,那么我可以使用计数为10的
countdownlock
。在写入各自的列表(从主控制器线程传递到线程)后,每个线程都会对闩锁进行倒计时,在主控制器中,一旦所有线程都完成了,我会将所有结果合并为一个

我有10个线程同时写入一个数据结构

我认为最好每个线程使用一个单独的数据结构。这样,线程之间就不需要同步,而且对CPU缓存也更加友好

最后,它们可以结合在一起


至于底层结构:如果元素的大小是固定的,那么最好使用数组/verctor。加入它们只会获取它们所占用内存块的一个副本,具体取决于实现情况,但列表总是比较慢。

填充意味着您只需要快速写入或快速读取?仅快速写入。我只在最后读一次。
Collections.synchronizedList
可以工作,但您仍然需要选择支持列表(例如
ArrayList
LinkedList
,等等)。由于元素是唯一的,您也可以尝试使用诸如
ConcurrentSkipListSet
之类的集合,这将强制实现唯一性(也许对您有用?)。性能完全取决于您的读/写模式。最好的了解方法可能是自己测试。另一种可能性是:完全避免同步,写入10个单独的集合(每个线程一个),并且只在最后合并它们以进行单次读取。您只是在开始时初始化数据结构,还是临时初始化数据结构?