为什么有ConcurrentSkipListMap,但没有未同步的版本


默认情况下,

Java 集合框架中的大多数类都是不同步的,但如果需要它们是线程安全的,则可以将它们设置为同步的内容。同步会降低性能,因此,如果您要编写不需要线程安全的内容,则最好使用不同步版本。

ConcurrentSkipListMap不遵循这个方案。没有未同步的版本。为什么对于不需要线程安全的应用程序,没有更快的非同步SkipListMap,与集合框架的其余部分保持一致?

我所能想到的是,跳过列表的最简单实现已经是线程安全的,因此拥有同步版本不会对性能造成损失。这是有某种意义的,但看看源代码并不能完全证明这一点。虽然代码中没有synchronized块,但Javadoc确实以

此类实现了 SkipList 的并发变体...

这表明它正在不遗余力地修改算法以使其线程安全。后来,我们读了

这些列表中的基本思想是在删除时标记已删除节点的"下一个"指针,以避免与并发插入冲突......

这听起来好像也涉及某种开销。

只是这个开销太小了,不值得有一个非线程安全的SkipListMap吗?

虽然Java没有SkipListMap,但它有一个非同步的对应物ConcurrentSkipListMap - 树状图

TreeMapConcurrentSkipListMap都实现SortedMapNavigableMap并根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于所使用的构造函数。

但是 TreeMap 在内部使用红黑树,ConcurrentSkipListMap 使用 java 文档中提到的 SkipList 的并发变体。

所以,如果你想要一个 ConcurrentSkipListMap 的不同步版本,你可以使用TreeMap

ConcurrentSkipListMap 是基于 CAS 操作的无锁实现。从理论上讲,如果您仅在单个线程中使用它,则不必支付任何性能损失。没有同步。当存在争用而不是阻塞时,实现实质上是循环来解决争用。如果没有争用,则没有循环。

相关内容

  • 没有找到相关文章

最新更新