用于快速并发插入的最佳Java数据结构
我的用例如下:我有10个线程同时写入一个数据结构。数据结构中元素的顺序并不重要。所有元素都是独一无二的。我将只在最后一次读取这个数据结构用于快速并发插入的最佳Java数据结构,java,multithreading,performance,data-structures,concurrency,Java,Multithreading,Performance,Data Structures,Concurrency,我的用例如下:我有10个线程同时写入一个数据结构。数据结构中元素的顺序并不重要。所有元素都是独一无二的。我将只在最后一次读取这个数据结构 适合此目的的最快本机Java数据结构是什么?从我的阅读来看,似乎是集合。synchronizedList可能是“转到”选项?没有必要在列表上同步,因为每个线程都可以处理其本地副本,最后可以将所有线程的结果合并到一个最终列表中 如果我打算使用JDK7和更高版本,那么我将使用fork和join,在每个fork任务中创建简单的List,最后在join阶段的末尾将其加
适合此目的的最快本机Java数据结构是什么?从我的阅读来看,似乎是
集合。synchronizedList
可能是“转到”选项?没有必要在列表上同步,因为每个线程都可以处理其本地副本,最后可以将所有线程的结果合并到一个最终列表中
如果我打算使用JDK7和更高版本,那么我将使用fork和join,在每个fork任务中创建简单的List
,最后在join阶段的末尾将其加入到主列表中
如果我在JDK6上,那么我可以使用计数为10的countdownlock
。在写入各自的列表(从主控制器线程传递到线程)后,每个线程都会对闩锁进行倒计时,在主控制器中,一旦所有线程都完成了,我会将所有结果合并为一个
我有10个线程同时写入一个数据结构
我认为最好每个线程使用一个单独的数据结构。这样,线程之间就不需要同步,而且对CPU缓存也更加友好
最后,它们可以结合在一起
至于底层结构:如果元素的大小是固定的,那么最好使用数组/verctor。加入它们只会获取它们所占用内存块的一个副本,具体取决于实现情况,但列表总是比较慢。填充意味着您只需要快速写入或快速读取?仅快速写入。我只在最后读一次。
Collections.synchronizedList
可以工作,但您仍然需要选择支持列表(例如ArrayList
,LinkedList
,等等)。由于元素是唯一的,您也可以尝试使用诸如ConcurrentSkipListSet
之类的集合,这将强制实现唯一性(也许对您有用?)。性能完全取决于您的读/写模式。最好的了解方法可能是自己测试。另一种可能性是:完全避免同步,写入10个单独的集合(每个线程一个),并且只在最后合并它们以进行单次读取。您只是在开始时初始化数据结构,还是临时初始化数据结构?