保持插入顺序的并发集合

时间:2016-04-19 16:45:27

标签: java collections concurrentmodification

我正在寻找可以维持广告订单的并发列表。有没有人有一些好的推荐?

我从番石榴中看一些例如SetFromMap,但在新版本中不推荐使用它们。

谢谢。

3 个答案:

答案 0 :(得分:4)

CopyOnWriteArrayListList,它们都维护广告订单顺序(正如List所预期的那样)并允许并发访问。

文档here

答案 1 :(得分:3)

如果你主要是读取操作,很少有写操作,而你没有太多的元素,那么你可以使用CopyOnWriteArrayList,因为它是一个List的无锁实现,用于读取操作,如它几乎不会更快但写入操作的成本非常高,因为每次写入都会重新构建整个List以便能够提供新的只读副本用于下一次读取操作。

在您的情况下,您有很多写入操作和很多元素要放入您的收藏中,CopyOnWriteArrayList 显然不是适合您的选项。

我建议您使用一个可以在Queue包中找到的线程安全java.util.concurrent。根据您的上下文和您的JDK版本,最佳选择可能会发生变化,但如果您不需要blocking queuedeque但只需要pure collection,那么最佳选择可能是{ {1}},ArrayBlockingQueueConcurrentLinkedQueue但根据此benchmark result(有点旧),LinkedBlockingQueue提供了最佳的整体表现。

但是当我们谈论表演时,第一个也是最重要的建议是:总是在目标环境上进行测试,这是了解什么是最佳选择的唯一有效方式

答案 2 :(得分:0)

  

最大值为10k元素

如果您的更新率极低,CopyOnWriteArrayList是一种可能的解决方案。这将有效地进行并发读取。

你遇到的问题是并发和有序是相反的问题。要进行排序,您需要序列化更新以确定订单。要获得并发性,您需要放弃订购。

有一个ConcurrentLinkedQueue,但这只允许并发read(1)和write(1)