什么时候ConcurrentSkipListSet有用?

我刚刚在Java 6 API上看到了这个数据结构,我很好奇它什么时候会成为一个有用的资源。 我正在为scjp考试而学习,尽pipe我已经看过提及它的模拟考题,但是我没有看到它在凯西·谢拉的书上。

ConcurrentSkipListSet和ConcurrentSkipListMap在您需要一个将被多个线程访问的已sorting容器时非常有用。 这些本质上是并发代码的TreeMap和TreeSet的等价物。

JDK 6的实现基于 IBM的Maged Michael的高性能dynamic无锁哈希表和基于列表的集合 ,这表明可以使用比较和交换(CAS)操作以primefaces方式在跳过列表上执行大量操作。 这些都是无锁的,所以当你使用这些类的时候,你不必担心synchronized (对于大多数操作)的开销。

Java中没有基于红黑树的并发Map / Set实现。 我仔细查看了一下文献,发现一些 论文显示并发RB树超越跳过列表,但是很多这些testing是用事务性内存完成的,目前在任何主stream体系结构中硬件上都不支持。

我假设JDK家伙在这里跳过了一个列表,因为这个实现是众所周知的,因为它使得它无锁是简单和可移植的(使用CAS)。 如果有人关心澄清,请做。 我很好奇。

当你需要一个可以安全地同时被多个线程访问的集合时,这些是很有用的。 它还通过弱一致性提供良好的性能 – 在遍历Set时插入可以安全地进行,但是不能保证你的Iterator将看到插入。

跳过列表是sorting列表,并且有效地用log(n)性能进行修改。 在这方面它就像TreeSet一样。 但是没有ConcurrentTreeSet。 我听到的是跳过列表很容易实现,这可能是为什么。

无论如何,当你需要一个并发的,sorting的和有效的集合时,你可以使用ConcurrentSkipListSet

ConcurrentSkipListMap在我需要为本地caching实现复制层时是一个很棒的发现。 Map方面实现了caching,而List方面让我跟踪对象出现在caching中的顺序。 该列表的“跳过”方面使得从列表中的一个位置移除一个对象并且在caching中replace它时将其结束。