我刚刚在Java 6 API上看到了这种数据结构,并且很好奇它何时会成为有用的资源。我正在为scjp考试学习,尽管我看到过模拟考试中提到它的内容,但Kathy Sierra的书并未涵盖它。
Answers:
当您需要一个可以被多个线程访问的排序容器时,ConcurrentSkipListSet和ConcurrentSkipListMap很有用。这些本质上是并发代码的TreeMap和TreeSet的等效项。
JDK 6的实现基于IBM Maged Michael的高性能动态无锁哈希表和基于列表的集,这表明您可以使用比较和交换(CAS)操作原子地对跳过列表执行很多操作。这些都是无锁的,因此您不必担心synchronized
使用这些类时(对于大多数操作)的开销。
Java目前没有基于Red-Black树的并发Map / Set实现。我通过文献查了一下,发现一对夫妇 的论文即表明并发RB树跑赢跳跃列表,但很多这些测试都是用做事务性的存储器,这是不是在硬件支持目前任何主要的架构。
我假设JDK专家在此处使用了跳过列表,因为该实现是众所周知的,并且使其无锁是简单且可移植的(使用CAS)。如果有人想澄清,请这样做。我很好奇。
当您需要可以同时由多个线程安全访问的集合时,这些选项很有用。它还通过保持弱一致性而提供了不错的性能-在迭代Set时可以安全地进行插入,但是不能保证Iterator会看到该插入。