Java 集合框架中的大多数类都是不同步的,但如果需要它们是线程安全的,则可以将它们设置为同步的内容。同步会降低性能,因此,如果您要编写不需要线程安全的内容,则最好使用不同步版本。
但ConcurrentSkipListMap
不遵循这个方案。没有未同步的版本。为什么对于不需要线程安全的应用程序,没有更快的非同步SkipListMap
,与集合框架的其余部分保持一致?
我所能想到的是,跳过列表的最简单实现已经是线程安全的,因此拥有同步版本不会对性能造成损失。这是有某种意义的,但看看源代码并不能完全证明这一点。虽然代码中没有synchronized
块,但Javadoc确实以
此类实现了 SkipList 的并发变体...
这表明它正在不遗余力地修改算法以使其线程安全。后来,我们读了
这些列表中的基本思想是在删除时标记已删除节点的"下一个"指针,以避免与并发插入冲突......
这听起来好像也涉及某种开销。
只是这个开销太小了,不值得有一个非线程安全的SkipListMap
吗?
虽然Java没有SkipListMap
,但它有一个非同步的对应物ConcurrentSkipListMap
- 树状图
TreeMap
和ConcurrentSkipListMap
都实现SortedMap
,NavigableMap
并根据其键的自然顺序进行排序,或者由映射创建时提供的比较器进行排序,具体取决于所使用的构造函数。
但是 TreeMap 在内部使用红黑树,ConcurrentSkipListMap 使用 java 文档中提到的 SkipList 的并发变体。
所以,如果你想要一个 ConcurrentSkipListMap
的不同步版本,你可以使用TreeMap
ConcurrentSkipListMap 是基于 CAS 操作的无锁实现。从理论上讲,如果您仅在单个线程中使用它,则不必支付任何性能损失。没有同步。当存在争用而不是阻塞时,实现实质上是循环来解决争用。如果没有争用,则没有循环。