【问题标题】:class to handle concurrent data insertion in java [closed]在java中处理并发数据插入的类[关闭]
【发布时间】:2012-02-24 08:16:39
【问题描述】:

将始终有 500+ 个线程同时将唯一对象上传到存储桶。

在这种情况下,我应该使用哪个数据结构/类来在 java 中实现存储桶。

仅供参考:

我尝试使用 ArrayList、Vector、ConcurrentHashMap、ArrayBlockingQueue、LinkedBlockingQueue。

ArrayList 失败,因为它不是线程安全的。 Vector 会消耗更多的插入时间。 (因为等待监视器锁定的时间很长)

...最后,我使用了 ArrayBlockingQueue,这听起来很适合比较其他人。

如果此案例存在任何其他好的类/数据结构,请建议我。

【问题讨论】:

  • 你需要一套还是一张清单?即,数据结构是否应该自动过滤掉重复的元素?这是数据结构的一个关键区别,对回答您的问题很重要。
  • 不会有重复的元素。具体来说,我需要一个清单。

标签: java insert java.util.concurrent


【解决方案1】:

竞争将非常高,因此您可能希望查看可用的无锁无等待实现,或者 - 为简单起见 - 使用 ConcurrentHashMap。

锁定条带化是这里的关键优势,因此对于读取操作您没有锁定,对于写入操作您只锁定现有存储桶的一个子集,并且您锁定整个哈希表仅用于重新散列。

你可以在这里找到更多:

Performance ConcurrentHashmap vs HashMap

Java Hashtable many accesses problem

【讨论】:

    【解决方案2】:

    这实际上取决于您在添加内容之后或添加内容期间想要做什么。您首先需要考虑这一点。

    在可以想象的最简单的情况下,也许您想稍后以不特定的顺序迭代对象。如果是这样的话,ConcurrentLinkedQueue 在插入性能方面可能是最好的。

    【讨论】:

      【解决方案3】:

      您正在做出正确的决定来衡量绩效。

      一般而言,LinkedBlockingQueue 在并发访问方面比 ArrayListBlockingQueue 表现更好,所以我肯定会尝试。

      【讨论】:

      • 就我而言,插入只是并发的。访问或轮询值将由单个线程处理。
      猜你喜欢
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      相关资源
      最近更新 更多