最高效但线程安全的列表/设置

时间:2015-06-08 02:09:45

标签: java list concurrency

Java拥有大量针对并发性和线程安全性而设计的不同集合,我不知道为我的情况选择哪一个。

多个线程可能正在调用.add().remove(),我将经常使用List<T> newList = new ArrayList<T>(concurrentList)之类的内容复制此列表。我永远不会循环并发列表。

我想过像CopyOnWriteArrayList这样的东西,但我读过它效率非常低,因为每次修改它都会自我复制。我希望在安全和效率之间找到一个很好的妥协。

这种情况的最佳列表(或设置)是什么?

4 个答案:

答案 0 :(得分:4)

正如@SpiderPig所说,具有List的最佳案例场景将是一个不可变的,单链接列表。

然而,看看这里做了什么,List是不必要的(@ bhspencer&#39}。 ConcurrentSkipListSet最有效(@augray)。

This Related Thread已接受的答案提供了对不同并发集合的利弊的更多见解。

答案 1 :(得分:1)

您可能想要查看ctrie是否适合您的用例 - 它具有线程安全的addremove操作,以及“复制”(实际上,拍摄快照)数据结构在O(1)中运行。我知道数据结构的两个JVM实现:implementation oneimplementation two

答案 2 :(得分:0)

Collections.newSetFromMap(new ConcurrentHashMap<...>())

这通常是普通Set的完成方式(HashSet实际上是HashMap的修改包装器)。它既提供了ConcurrentHashMap的性能/可靠性的优点,又没有ConcurrentSkipListSet(排序),COW列表(复制每个修改)或并发队列(FIFO / LIFO排序)等额外功能。

编辑:我没有看到@ bhspencer对原帖的评论,为偷走聚光灯而道歉。

答案 3 :(得分:0)

基于散列的哈希集将优于列表。 添加最后一个并删除第一个将与LinkedList良好。 在基于数组索引的arraylist中搜索速度很快。

谢谢,