我需要一个非常快速(插入,删除,包含)高度并发的列表,可以使用比较器/可比较进行排序。
现有的ConcurrentSkipListSet是理想的,如果它是一个列表而不是一个集合。我需要插入多个与数据结构相同的项目。
我目前正在考虑使用LinkedDeque,如果我找不到更好的东西,但该结构比高争用的跳过列表慢得多。
有什么建议吗?
编辑:我真正需要的是,使用compareTo进行排序,可以同时插入并使用对象标识删除/获取项目。评论中提到的所有其他并发要求仍然适用。
答案 0 :(得分:5)
现有的ConcurrentSkipListSet是理想的,如果它是一个列表而不是一个集合。
所以它的核心SkipList data-structure是一个链表。如果你担心顺序和顺序遍历它的能力,那么SkipList也可以很好地工作。它也是平衡树的概率替代,这就是为什么它也可以是Set
或Map
。内存中的数据结构如下所示:
引用Javadocs:
此类实现SkipLists的并发变体,为containsKey,get,put和remove操作及其变体提供预期的平均log(n)时间成本。插入,删除,更新和访问操作由多个线程安全地同时执行。迭代器是弱一致的,在迭代器创建时或之后的某个时刻返回反映地图状态的元素。它们不会抛出ConcurrentModificationException,并且可能与其他操作同时进行。升序键有序视图及其迭代器比降序视图快。
如果您详细了解了List
所需的功能,我可以更好地回答ConcurrentSkipListSet
是否能够正常工作。
修改强>
啊,我明白了。在评论中来回一些之后,似乎你需要能够将两个等价的对象粘贴到Set
中,这是不可能的。我们得出的结果是永远不会让compareTo(...)
返回0.这有点像黑客,但是使用AtomicLong
为每个对象生成唯一编号,然后您可以在真实比较字段时比较这些数字(在这种情况下,数值超时值)是相等的。这将允许具有相同字段的对象插入Set
并根据字段保持正确的顺序。