【问题标题】:Why is there a ConcurrentSkipListMap, but no unsynchronized version?为什么有 ConcurrentSkipListMap,却没有非同步版本?
【发布时间】:2015-01-11 02:21:07
【问题描述】:

Java 集合框架中的大多数类默认情况下是不同步的,但如果您需要它们是线程安全的,可以将它们制成同步的东西。同步有性能损失,所以如果你写的东西不需要是线程安全的,你最好使用非同步版本。

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

我能想到的是,跳过列表的最简单实现已经是线程安全的,因此拥有同步版本不会有性能损失。这会有些道理,但是看一下源代码并不能完全证明这一点。尽管代码中没有 synchronized 块,但 Javadoc 确实以

开头

此类实现 SkipLists 的并发变体...

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

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

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

仅仅是这个开销太小以至于不值得拥有一个非线程安全的SkipListMap吗?

【问题讨论】:

  • 查看this question 以讨论针对二叉树的跳过列表,因此 TreeMap 是 ConcurrentSkipListMap 的不同步对应物。添加到 NavigableMap 接口的两个非线程安全实现中没有多大意义。
  • @s106mo 这是一个有趣的讨论,但TreeMap 实现了一个红黑树,它具有相似的属性,但不是 SkipList 的实现。
  • @chiastic-security 在需要跳过列表而不是红黑树的地方,您实际上想要做什么?只是好奇。
  • 抱歉,不清楚:我知道 TreeMap 是一个红黑树实现。我的观点是,添加一个额外的非线程安全的 SkipListMap 实现没有多大意义。基于跳过列表的地图的运行时复杂度数据并不比 TreeMap 的好,但 Java API 会臃肿。
  • 对垃圾邮件感到抱歉,但还有一件事:当 Java 1.2 于 1998 年发布时,William Pugh 发明的跳过列表仅在 9 年前。通常,在专业/商业产品中采用新算法需要一段时间。所以这也可能影响了这样一个事实,即 Java 中默认的非线程安全 SortedMap 实现是 TreeMap(红黑树早在 1972 年就已经发明了)。

标签: java multithreading thread-safety skip-lists concurrentskiplistmap


【解决方案1】:

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

【讨论】:

  • 仅仅因为没有“同步”,not 就意味着单线程使用没有性能损失。大概它使用了 java 中“volatile”的内存强度,这有性能损失。
  • 是的,如果您认为使用 volatile 会影响应用的可感知性能,那么您是对的。但它的内存屏障与使用同步或 ReentrantLock 不同。
  • 易失性使用与单线程、无竞争同步属于同一类别。
  • @jtahlborn 无可争议,他们不在同一类别中。即使在无竞争的情况下获取互斥体也更昂贵。
【解决方案2】:

虽然 Java 没有 SkipListMap,但它有一个非同步对应的 ConcurrentSkipListMap - TreeMap

TreeMapConcurrentSkipListMap 都实现了 SortedMapNavigableMap,并根据其键的自然顺序或在地图创建时提供的 Comparator 进行排序,具体取决于使用的构造函数。

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

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

【讨论】:

    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 2011-07-22
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多