我的用例如下:我有10个线程同时写入一个数据结构。数据结构中元素的顺序无关紧要。所有元素都是独一无二的。我只会在最后一次从这个数据结构中读取一次。
什么是最适合此目的的原生Java数据结构?从我的阅读来看,似乎Collections.synchronizedList
可能是选择吗?
答案 0 :(得分:3)
您无需在列表上进行同步,因为每个线程都可以在其本地副本上工作,最后可以将所有线程的结果连接到最终列表中。
如果要使用JDK7及更高版本,那么我将使用fork和join,我会在每个分叉任务中创建简单List
,最后在连接阶段的最后一个主列表中加入它
如果我在JDK6上,那么我可以使用计数为10的CountDownLatch
。写入各自列表后的每个线程(从主控制器线程传递到线程)倒计时锁定和主要控制器,一旦完成所有线程,我会将所有结果合并为一个。
答案 1 :(得分:3)
我有10个线程同时写入一个数据结构。
我认为每个线程最好使用单独的数据结构。这样,线程之间就不需要同步了,而且CPU缓存也会更友好。
最后他们可以加入。
对于底层结构:如果元素是固定大小,则数组/ verctor最好。加入它们只会占用它们占用的内存块的副本,具体取决于实现 - 但列表总是会更慢。