concurrentskiplistset直接基于concurrentskiplistmap实现,以元素为key、boolean.true为value;其有序性完全继承自跳表结构的自然排序机制,依赖comparable或指定comparator保障全序排列与并发一致性。

ConcurrentSkipListSet 本身并不“封装”ConcurrentSkipListMap,而是**直接基于它实现的**——它内部持有一个 ConcurrentSkipListMap 实例,把元素作为 key,用一个固定的 dummy value(如 Boolean.TRUE)作为 value。有序性不是靠“封装逻辑”保障的,而是**完全继承自底层 ConcurrentSkipListMap 的跳表结构和自然排序机制**。
底层复用:用 Map 模拟 Set 语义
ConcurrentSkipListSet 的核心设计是轻量级适配:
- 构造时创建一个
ConcurrentSkipListMap<e boolean></e>,key 类型即 Set 元素类型,value 固定为Boolean.TRUE - 所有操作(
add、contains、remove)都转为对 map 的putIfAbsent、containsKey、remove调用 - 迭代器返回的是 map 的 keySet 迭代器,因此天然保持跳表的有序遍历顺序
有序性来源:跳表结构本身保证
ConcurrentSkipListMap 的有序性不依赖外部封装,而来自其底层 SkipList 实现:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 节点按 key 的
Comparable或指定Comparator排序,插入/查找时严格维护链表层级顺序 - 所有并发操作(如
put、remove)都通过无锁 CAS + 局部锁(head/tail + level node)保障结构一致性,不破坏排序 - 遍历时从最底层头节点开始,沿 right 指针线性扫描,结果天然升序(或按 comparator 定义的顺序)
注意点:Comparator 必须一致且稳定
有序性的正确性高度依赖比较逻辑:
- 若元素未实现
Comparable,必须在构造时传入显式Comparator;否则运行时报ClassCastException - Comparator 的行为必须满足:自反性、对称性、传递性;且不能在比较过程中修改参与比较的对象状态
- 同一个 Set 实例中,所有元素必须能被同一套比较规则全序排列,否则迭代或查找可能出错或死循环
与 TreeSet 的关键区别
虽然两者都基于红黑树/跳表实现有序,但并发模型完全不同:
- TreeSet 是非线程安全的,需手动加锁(如
Collections.synchronizedSortedSet),锁粒度大、吞吐低 - ConcurrentSkipListSet 基于无锁跳表,支持高并发读写,且排序逻辑完全由底层 map 承担,无需额外同步
- 它不提供
subSet/headSet/tailSet的强一致性快照(这些视图也是并发安全的,但反映的是近实时状态)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










