文章目录
- 源码角度了解ConcurrentSkipListMap
- 跳查表的数据结构
- put()方法
- get()方法
- remove()方法
- ConcurrentSkipListSet
- 总结
源码角度了解ConcurrentSkipListMap
ConcurrentSkipListMap的key是有序的,它是基于跳查表来进行实现的map,跳查表可以实现无锁的链表,我们知道链表的操作插入元素的时候直接修改前一个位置的节点,指向这个节点,然后这个节点又指向下一个节点,删除元素的时候直接修改前一个位置的节点指向删除节点的下一个节点,当插入和删除并发执行的时候,可能出现问题,把插入的节点删除。
如图,插入8 ,删除3这个操作同时进行的话,插入8操作的是3的后继节点,删除3操作的是3的前驱节点,这个操作互相感知不到,这样会出现并发的问题,因此ConcurrentSkipListMap使用了跳表,不同的是在节点3删除的时候就进行标记它的后继节点,让后继节点指向一个marker节点,这样插入的时候就判断是否进行了删除节点的操作,从而感知到删除操作。
跳查表的数据结构
代码语言:javascript复制* 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
* - - - - - - - - - - - -
这是源码中描述的数据结构,非常权威