ConcurrentSkipList?也就是说,不是ConcurrentSkipListSet

时间:2013-09-03 14:08:40

标签: java concurrency skip-lists

我需要一个非常快速(插入,删除,包含)高度并发的列表,可以使用比较器/可比较进行排序。

现有的ConcurrentSkipListSet是理想的,如果它是一个列表而不是一个集合。我需要插入多个与数据结构相同的项目。

我目前正在考虑使用LinkedDeque,如果我找不到更好的东西,但该结构比高争用的跳过列表慢得多。

有什么建议吗?

编辑:我真正需要的是,使用compareTo进行排序,可以同时插入并使用对象标识删除/获取项目。评论中提到的所有其他并发要求仍然适用。

1 个答案:

答案 0 :(得分:5)

  

现有的ConcurrentSkipListSet是理想的,如果它是一个列表而不是一个集合。

所以它的核心SkipList data-structure是一个链表。如果你担心顺序和顺序遍历它的能力,那么SkipList也可以很好地工作。它也是平衡树的概率替代,这就是为什么它也可以是SetMap。内存中的数据结构如下所示:

enter image description here

引用Javadocs:

  

此类实现SkipLists的并发变体,为containsKey,get,put和remove操作及其变体提供预期的平均log(n)时间成本。插入,删除,更新和访问操作由多个线程安全地同时执行。迭代器是弱一致的,在迭代器创建时或之后的某个时刻返回反映地图状态的元素。它们不会抛出ConcurrentModificationException,并且可能与其他操作同时进行。升序键有序视图及其迭代器比降序视图快。

如果您详细了解了List所需的功能,我可以更好地回答ConcurrentSkipListSet是否能够正常工作。


修改

啊,我明白了。在评论中来回一些之后,似乎你需要能够将两个等价的对象粘贴到Set中,这是不可能的。我们得出的结果是永远不会让compareTo(...)返回0.这有点像黑客,但是使用AtomicLong为每个对象生成唯一编号,然后您可以在真实比较字段时比较这些数字(在这种情况下,数值超时值)是相等的。这将允许具有相同字段的对象插入Set并根据字段保持正确的顺序。