维护插入顺序的并发集合

A concurrent collection that maintains insertion order

我正在寻找一个可以维护插入顺序的并发列表。大家有什么好的推荐吗?

我看了一些番石榴,例如SetFromMap,但在新版本中已弃用。

谢谢。

CopyOnWriteArrayList 是一个 List,它既保持插入顺序(正如 List 所预期的那样)又允许并发访问。

文档here

Maximum will be 10k elements

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

你的问题是并发和有序是相反的问题。要进行排序,您需要序列化更新以确定顺序。要具有并发性,您需要放弃排序。

有一个 ConcurrentLinkedQueue,但这只允许并发读取 (1) 和写入 (1)

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

对于您的情况,您有很多写操作和很多元素要放入您的集合中,CopyOnWriteArrayList显然不适合您。

我对你的情况的建议是使用一个线程安全的 Queue,你可以在 java.util.concurrent 包中找到它。根据您的上下文和您的 JDK 版本,最佳选择可能会改变,但如果您不特别需要 blocking queuedeque,而只需要 pure collection,则最好选择可能是 ArrayBlockingQueueConcurrentLinkedQueueLinkedBlockingQueue,但根据这个 benchmark result(有点旧),LinkedBlockingQueue 提供了最好的整体性能。

但是当我们谈论性能时,第一个也是最重要的建议是:始终在您的目标环境中进行测试,这是了解最佳选择的唯一有效方法为你.