ConcurrentSkipListMap
底层使用的是SkipList结构,也就是跳表
SkipList
SkipList让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过以时间换空间,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的节点,从而提高效率
SkipList具备如下特性:
- 由很多层结构组成,level是通过一定的概率随机产生的
- 每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法
- 最底层(Level 1)的链表包含所有元素
- 如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现
- 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素
ConcurrentSkipListMap实现
ConcurrentSkipListMap内部采用了SkipList数据结构实现,使用三个内部类来构建这样的结构:Node、Index、HeadIndex
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| * Head nodes Index nodes * +-+ right +-+ +-+ * |2|---------------->| |--------------------->| |->null * +-+ +-+ +-+ * | down | | * v v v * +-+ +-+ +-+ +-+ +-+ +-+ * |1|----------->| |->| |------>| |----------->| |------>| |->null * +-+ +-+ +-+ +-+ +-+ +-+ * v | | | | | * Nodes next v v v v v * +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ * | |->|A|->|B|->|C|->|D|->|E|->|F|->|G|->|H|->|I|->|J|->|K|->null * +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+
|
Node结构
与一般的单链表结构相似
1 2 3 4 5
| static final class Node<K,V> { final K key; volatile Object value; volatile Node<K,V> next; }
|
Index结构
提供了一个基于Node节点的索引,以及向下和向右的索引
1 2 3 4 5
| static class Index<K,V> { final Node<K,V> node; final Index<K,V> down; volatile Index<K,V> right; }
|
HeadIndex结构
比Index多了一个level来表示层级
1 2 3 4 5 6 7
| static final class HeadIndex<K,V> extends Index<K,V> { final int level; HeadIndex(Node<K,V> node, Index<K,V> down, Index<K,V> right, int level) { super(node, down, right); this.level = level; } }
|