并发容器之ConcurrentSkipListMap

ConcurrentSkipListMap

底层使用的是SkipList结构,也就是跳表

SkipList

SkipList让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过以时间换空间,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的节点,从而提高效率

SkipList具备如下特性:

  • 由很多层结构组成,level是通过一定的概率随机产生的
  • 每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法
  • 最底层(Level 1)的链表包含所有元素
  • 如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出现
  • 每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素

ConcurrentSkipListMap实现

ConcurrentSkipListMap内部采用了SkipList数据结构实现,使用三个内部类来构建这样的结构:Node、Index、HeadIndex

rust 复制代码
* 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结构

与一般的单链表结构相似

java 复制代码
static final class Node<K,V> {
    final K key;
    volatile Object value;
    volatile Node<K,V> next;
}

Index结构

提供了一个基于Node节点的索引,以及向下和向右的索引

java 复制代码
static class Index<K,V> {
    final Node<K,V> node;
    final Index<K,V> down;
    volatile Index<K,V> right;
}

HeadIndex结构

比Index多了一个level来表示层级

java 复制代码
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;
    }
}

zhhll.icu/2022/多线程/并发...

本文由mdnice多平台发布

相关推荐
one_love_zfl24 分钟前
java面试-微服务组件篇
java·微服务·面试
一只大袋鼠27 分钟前
Java进阶:CGLIB动态代理解析
java·开发语言
环流_41 分钟前
HTTP 协议的基本格式
java·网络协议·http
爱滑雪的码农42 分钟前
Java基础十三:Java中的继承、重写(Override)与重载(Overload)详解
java·开发语言
【 】4231 小时前
C++&STL(Standard Template Library,标准模板库)
java·开发语言·c++
茉莉玫瑰花茶1 小时前
LangChain 核心组件 [ 2 ]
java·数据库·langchain
信徒_1 小时前
ID 生成技术选型
java
a8a3021 小时前
Laravel8.x新特性全解析
java·spring boot·后端
XiYang-DING1 小时前
【Java EE】CAS(Compare And Swap)
java·开发语言·java-ee
白露与泡影1 小时前
Spring Boot 完整流程
java·spring boot·后端