将有500多个线程同时将唯一对象上传到存储桶。
在这种情况下,我应该使用哪个数据结构/类来实现java中的存储桶。
仅供参考:
我尝试使用ArrayList,Vector,ConcurrentHashMap,ArrayBlockingQueue,LinkedBlockingQueue。
ArrayList失败,因为它不是线程安全的。 Vector会占用更多插入时间。 (因为获取监视器锁定的等待时间很长)
...最后,我使用了ArrayBlockingQueue,这在比较其他方面听起来不错。
如果此案例中存在任何其他良好的类/数据结构,请建议我。
答案 0 :(得分:2)
争用将非常高,因此您可能希望查看可用的无锁等待实现,或者 - 保持简单 - 使用ConcurrentHashMap。
锁定条带化是这里的关键优势,因此对于读取操作,您没有锁定,对于写入操作,您只锁定现有存储桶的子集,并且仅锁定整个哈希表以进行重新散列。
您可以在这里找到更多信息:
答案 1 :(得分:1)
您正在做出正确的决定来衡量绩效。
一般来说,LinkedBlockingQueue对于并发访问比ArrayListBlockingQueue表现更好,所以我肯定会尝试。
答案 2 :(得分:1)
这实际上取决于添加内容后或添加内容时要执行的操作。你首先需要考虑这个问题。
在可以想象的最简单的情况下,您可能希望稍后以特定顺序迭代对象。如果是这种情况,ConcurrentLinkedQueue在插入性能方面可能是最好的。