【发布时间】:2010-12-26 15:24:07
【问题描述】:
我刚刚在 Java 6 API 上看到了这个数据结构,我很好奇它什么时候会成为有用的资源。我正在为 scjp 考试而学习,但我没有看到 Kathy Sierra 的书涵盖了它,即使我看过提到它的模拟考试问题。
【问题讨论】:
标签: java data-structures collections concurrency
我刚刚在 Java 6 API 上看到了这个数据结构,我很好奇它什么时候会成为有用的资源。我正在为 scjp 考试而学习,但我没有看到 Kathy Sierra 的书涵盖了它,即使我看过提到它的模拟考试问题。
【问题讨论】:
标签: java data-structures collections concurrency
ConcurrentSkipListSet 和ConcurrentSkipListMap 在您需要一个可被多个线程访问的排序容器时很有用。这些本质上是并发代码的 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)。如果有人想澄清,请这样做。我很好奇。
【讨论】:
当我需要为本地缓存实现复制层时,ConcurrentSkipListMap 是一个很棒的发现。 Map 方面实现了缓存,底层的 List 方面让我可以跟踪对象在缓存中出现的顺序。该列表的“跳过”方面使得从列表中的一个位置删除一个对象并在缓存中替换它时将其撞到末尾变得很有效。
【讨论】:
当您需要一个可以被多个线程同时安全访问的集合时,这些很有用。它还通过弱一致性提供了不错的性能——在您迭代 Set 时可以安全地进行插入,但不能保证您的迭代器会看到该插入。
【讨论】:
跳过列表是已排序的列表,使用 log(n) 性能可以有效地进行修改。在这方面它就像 TreeSet。但是没有 ConcurrentTreeSet。我听说跳过列表很容易实现,这可能就是原因。
不管怎样,当你需要一个并发的、有序的、高效的集合时,你可以使用 ConcurrentSkipListSet
【讨论】: