【发布时间】: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