Java拥有大量针对并发性和线程安全性而设计的不同集合,我不知道为我的情况选择哪一个。
多个线程可能正在调用.add()
和.remove()
,我将经常使用List<T> newList = new ArrayList<T>(concurrentList)
之类的内容复制此列表。我永远不会循环并发列表。
我想过像CopyOnWriteArrayList
这样的东西,但我读过它效率非常低,因为每次修改它都会自我复制。我希望在安全和效率之间找到一个很好的妥协。
这种情况的最佳列表(或设置)是什么?
答案 0 :(得分:4)
正如@SpiderPig所说,具有List
的最佳案例场景将是一个不可变的,单链接列表。
然而,看看这里做了什么,List
是不必要的(@ bhspencer&#39}。 ConcurrentSkipListSet
最有效(@augray)。
This Related Thread已接受的答案提供了对不同并发集合的利弊的更多见解。
答案 1 :(得分:1)
您可能想要查看ctrie是否适合您的用例 - 它具有线程安全的add
和remove
操作,以及“复制”(实际上,拍摄快照)数据结构在O(1)中运行。我知道数据结构的两个JVM实现:implementation one,implementation two。
答案 2 :(得分:0)
Collections.newSetFromMap(new ConcurrentHashMap<...>())
这通常是普通Set的完成方式(HashSet实际上是HashMap的修改包装器)。它既提供了ConcurrentHashMap的性能/可靠性的优点,又没有ConcurrentSkipListSet(排序),COW列表(复制每个修改)或并发队列(FIFO / LIFO排序)等额外功能。
编辑:我没有看到@ bhspencer对原帖的评论,为偷走聚光灯而道歉。
答案 3 :(得分:0)
基于散列的哈希集将优于列表。 添加最后一个并删除第一个将与LinkedList良好。 在基于数组索引的arraylist中搜索速度很快。
谢谢,