ConcurrentSkipListSet什么时候有用?


84

我刚刚在Java 6 API上看到了这种数据结构,并且很好奇它何时会成为有用的资源。我正在为scjp考试学习,尽管我看到过模拟考试中提到它的内容,但Kathy Sierra的书并未涵盖它。

Answers:


175

当您需要一个可以被多个线程访问的排序容器时,ConcurrentSkipListSetConcurrentSkipListMap很有用。这些本质上是并发代码的TreeMap和TreeSet的等效项。

JDK 6的实现基于IBM Maged Michael的高性能动态无锁哈希表和基于列表的集,这表明您可以使用比较和交换(CAS)操作原子地对跳过列表执行很多操作。这些都是无锁的,因此您不必担心synchronized使用这些类时(对于大多数操作)的开销。

Java目前没有基于Red-Black树的并发Map / Set实现。我通过文献查了一下,发现一对夫妇 的论文即表明并发RB树跑赢跳跃列表,但很多这些测试都是用做事务性的存储器,这是不是在硬件支持目前任何主要的架构。

我假设JDK专家在此处使用了跳过列表,因为该实现是众所周知的,并且使其无锁是简单且可移植的(使用CAS)。如果有人想澄清,请这样做。我很好奇。


1
如果要以高性能的方式跟踪多线程环境中的唯一记录,这也很有用。
anataliocs,2017年

4

跳过列表是排序后的列表,可以有效地修改log(n)性能。在这方面,它就像TreeSet。但是没有ConcurrentTreeSet。我听说跳过列表很容易实现,这可能就是原因。

无论如何,当您需要并发,排序和高效的集合时,可以使用ConcurrentSkipListSet


2

当您需要可以同时由多个线程安全访问的集合时,这些选项很有用。它还通过保持弱一致性而提供了不错的性能-在迭代Set时可以安全地进行插入,但是不能保证Iterator会看到该插入。


1

当我需要为本地缓存实现复制层时,ConcurrentSkipListMap是一个绝佳的发现。Map方面实现了缓存,而底层的List方面则让我跟踪了对象在缓存中出现的顺序。该列表的“跳过”方面使从列表中的一个位置删除对象并将其在缓存中被替换到最后时更有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.