何时ConcurrentSkipListSet有用?

时间:2009-12-15 00:12:47

标签: java data-structures collections concurrency

我刚刚在Java 6 API上看到了这个数据结构,我很好奇它何时会成为一个有用的资源。我正在攻读scjp考试,虽然我已经看过提到它的模拟考试题目,但我并没有在Kathy Sierra的书中看到它。

4 个答案:

答案 0 :(得分:155)

当您需要一个可由多个线程访问的已排序容器时,

ConcurrentSkipListSetConcurrentSkipListMap非常有用。这些本质上是并发代码的TreeMap和TreeSet的等价物。

JDK 6的实现基于IBM的Maged Michael的High Performance Dynamic Lock-Free Hash Tables and List-Based Sets,它表明您可以使用compare and swap (CAS)操作以原子方式对跳过列表实施大量操作。这些是无锁的,因此当您使用这些类时,您不必担心synchronized(对于大多数操作)的开销。

目前在Java中没有基于Red-Black tree的并发Map / Set实现。我查看了一些文献,发现couple papers显示并发RB树的性能优于跳过列表,但很多这些测试都是使用transactional memory完成的,不支持目前任何主要架构上的硬件。

我假设JDK的人员在这里使用跳过列表,因为实现是众所周知的,因为使其无锁是简单和便携的(使用CAS)。如果有人关心澄清,请做。我很好奇。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

当我需要为本地缓存实现复制层时,ConcurrentSkipListMap是一个很棒的发现。 Map方面实现了缓存,底层的List方面让我可以跟踪对象在缓存中出现的顺序。该列表的“跳过”方面使得从列表中的一个位置移除对象并在缓存中替换它时将其撞到末尾是有效的。