我的使用场景如下:我有10个线程同时写入一个数据结构。数据结构中元素的顺序并不重要,所有元素都是唯一的。我只会在最后一次从这个数据结构中读取。
什么是最快的本地Java数据结构来适应这个目的?从我的阅读中,似乎 Collections.synchronizedList
可能是最好的选择?
我的使用场景如下:我有10个线程同时写入一个数据结构。数据结构中元素的顺序并不重要,所有元素都是唯一的。我只会在最后一次从这个数据结构中读取。
什么是最快的本地Java数据结构来适应这个目的?从我的阅读中,似乎 Collections.synchronizedList
可能是最好的选择?
不需要在列表上同步,因为每个线程都可以在其本地副本上工作,并且最终可以将所有线程的结果合并成一个最终列表。
如果使用JDK7及以上版本,则可以使用fork和join来创建简单的列表,在每个分叉任务中,最后在join阶段将其连接到主列表中。
如果使用JDK6,则可以使用计数器锁(CountDownLatch),计数器初始值为10。每个线程在向其从主控制线程传递的各自列表中写入后,都会倒计时锁定,然后在主控制器中,一旦所有线程完成,就会将所有结果组合成一个结果。
Collections.synchronizedList
可以使用,但您仍需要选择支持列表(例如ArrayList
、LinkedList
等)。由于元素是唯一的,您也可以尝试使用诸如ConcurrentSkipListSet
之类的集合,它将强制执行唯一性(也许对您有用?)。性能完全取决于您的读/写模式。最好的方法可能是自己测试。 - Stephen Rosenthal