【问题标题】:A concurrent collection that maintains insertion order [closed]维护插入顺序的并发集合[关闭]
【发布时间】:2023-03-15 20:42:01
【问题描述】:

我正在寻找一个可以保持插入顺序的并发列表。谁有好的推荐?

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

谢谢。

【问题讨论】:

标签: java collections concurrentmodification


【解决方案1】:

CopyOnWriteArrayList 是一个List,既维护插入顺序(正如List 所期望的那样)并允许并发访问。

文档here

【讨论】:

  • 这假定写入速率非常低,但它是最接近的匹配。
【解决方案2】:

最多为 10k 个元素

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

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

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

【讨论】:

    【解决方案3】:

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

    就你的情况而言,你有很多写操作和很多元素要放入你的集合中,CopyOnWriteArrayList 显然不是适合你的选择。

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-11
      • 2012-03-22
      • 1970-01-01
      • 2012-03-15
      • 2011-12-18
      • 1970-01-01
      • 2011-10-25
      • 2011-09-18
      • 2013-08-01
      相关资源
      最近更新 更多