维护插入顺序的并发集合
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 queue
或 deque
,而只需要 pure collection
,则最好选择可能是 ArrayBlockingQueue
、ConcurrentLinkedQueue
或 LinkedBlockingQueue
,但根据这个 benchmark result(有点旧),LinkedBlockingQueue
提供了最好的整体性能。
但是当我们谈论性能时,第一个也是最重要的建议是:始终在您的目标环境中进行测试,这是了解最佳选择的唯一有效方法为你.
我正在寻找一个可以维护插入顺序的并发列表。大家有什么好的推荐吗?
我看了一些番石榴,例如SetFromMap,但在新版本中已弃用。
谢谢。
CopyOnWriteArrayList
是一个 List
,它既保持插入顺序(正如 List
所预期的那样)又允许并发访问。
文档here。
Maximum will be 10k elements
如果您的更新率极低,CopyOnWriteArrayList 是一个可能的解决方案。这将允许有效地并发读取。
你的问题是并发和有序是相反的问题。要进行排序,您需要序列化更新以确定顺序。要具有并发性,您需要放弃排序。
有一个 ConcurrentLinkedQueue,但这只允许并发读取 (1) 和写入 (1)
如果您主要进行读取操作,写入操作很少,并且您没有太多元素,那么您可以使用 CopyOnWriteArrayList
,因为它是 List
的无锁实现,用于读取这样它几乎不可能更快的操作,但它 写入操作的成本非常高 对于每一次写入,它都会重新构建整个 List
以便能够提供下一次读取操作的新只读副本。
对于您的情况,您有很多写操作和很多元素要放入您的集合中,CopyOnWriteArrayList
显然不适合您。
我对你的情况的建议是使用一个线程安全的 Queue
,你可以在 java.util.concurrent
包中找到它。根据您的上下文和您的 JDK 版本,最佳选择可能会改变,但如果您不特别需要 blocking queue
或 deque
,而只需要 pure collection
,则最好选择可能是 ArrayBlockingQueue
、ConcurrentLinkedQueue
或 LinkedBlockingQueue
,但根据这个 benchmark result(有点旧),LinkedBlockingQueue
提供了最好的整体性能。
但是当我们谈论性能时,第一个也是最重要的建议是:始终在您的目标环境中进行测试,这是了解最佳选择的唯一有效方法为你.