源码角度了解ConcurrentSkipListMap

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码角度了解ConcurrentSkipListMap相关的知识,希望对你有一定的参考价值。

源码角度了解ConcurrentSkipListMap

ConcurrentSkipListMap的key是有序的,它是基于跳查表来进行实现的map,跳查表可以实现无锁的链表,我们知道链表的操作插入元素的时候直接修改前一个位置的节点,指向这个节点,然后这个节点又指向下一个节点,删除元素的时候直接修改前一个位置的节点指向删除节点的下一个节点,当插入和删除并发执行的时候,可能出现问题,把插入的节点删除。

如图,插入8 ,删除3这个操作同时进行的话,插入8操作的是3的后继节点,删除3操作的是3的前驱节点,这个操作互相感知不到,这样会出现并发的问题,因此ConcurrentSkipListMap使用了跳表,不同的是在节点3删除的时候就进行标记它的后继节点,让后继节点指向一个marker节点,这样插入的时候就判断是否进行了删除节点的操作,从而感知到删除操作。

跳查表的数据结构

* 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
* +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+

这是源码中描述的数据结构,非常权威

以上是关于源码角度了解ConcurrentSkipListMap的主要内容,如果未能解决你的问题,请参考以下文章

源码角度了解ConcurrentSkipListMap

源码角度了解阻塞队列之SynchronousQueue

源码角度了解Skywalking之建立连接与服务注册

源码角度了解Skywalking之@Trace注解的原理

源码角度了解Skywalking之告警机制是怎么实现的

源码角度了解Skywalking之Trace可以跨线程吗