Java ConcurrentSkipListSet何时有用?

Java ConcurrentSkipListSet何时有用?,java,data-structures,collections,concurrency,Java,Data Structures,Collections,Concurrency,我刚刚在Java6API上看到了这个数据结构,我很好奇它何时会成为有用的资源。我正在为scjp考试学习,我没有看到凯西·塞拉(Kathy Sierra)的书中提到这一点,尽管我见过提到这一点的模拟考试题 跳过列表是经过排序的列表,可以有效地修改日志(n)性能。在这方面,它就像树集。但是,没有ConcurrentTreeSet。我听说跳过列表很容易实现,这可能就是原因 无论如何,当您需要一个并发、排序且高效的集合时,您可以使用ConcurrentSkipListSet当您需要一个可由多个线程同时安

我刚刚在Java6API上看到了这个数据结构,我很好奇它何时会成为有用的资源。我正在为scjp考试学习,我没有看到凯西·塞拉(Kathy Sierra)的书中提到这一点,尽管我见过提到这一点的模拟考试题

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


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

当您需要一个可由多个线程同时安全访问的集合时,这些都很有用。它还通过弱一致性提供了良好的性能——在遍历集合时可以安全地进行插入,但不能保证迭代器会看到该插入。

并且在需要多线程访问的排序容器时非常有用。对于并发代码,这些基本上是TreeMap和TreeSet的等价物

JDK 6的实现基于IBM的Maged Michael,这表明您可以使用操作原子化地实现跳过列表上的许多操作。这些类是无锁的,因此当您使用这些类时,您不必担心
同步的
(对于大多数操作)的开销

目前,Java中没有基于并发映射/集的实现。我查阅了一些文献,发现了一个显示并发RB树优于跳过列表的测试,但是很多测试都是用它完成的,目前在任何主要体系结构的硬件上都不支持它


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

当我需要为自制缓存实现复制层时,ConcurrentSkipListMap是一个了不起的发现。映射方面实现了缓存,而底层列表方面让我能够跟踪对象在缓存中出现的顺序。该列表的“跳过”功能可以有效地从列表中的一个位置删除对象,并在缓存中替换对象时将其撞到底。

如果您希望以高效的方式跟踪多线程环境中的唯一记录,该功能也很有用。