-1

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

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

供参考:

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

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

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

如果这种情况下存在任何其他好的类/数据结构,请建议我。

4

3 回答 3

2

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

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

你可以在这里找到更多:

性能 ConcurrentHashmap 与 HashMap

Java Hashtable 多次访问问题

于 2012-02-01T16:38:35.620 回答
1

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

一般来说,LinkedBlockingQueue 在并发访问方面的性能比 ArrayListBlockingQueue 好,所以我肯定会尝试。

于 2012-02-01T16:34:00.697 回答
1

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

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

于 2012-02-01T16:36:05.227 回答