ConcurrentSkipListMap高并发原理探究和源码分析

本文探讨了ConcurrentSkipListMap作为高并发集合的实现,对比了它与TreeMap的区别。ConcurrentSkipListMap基于跳表,通过乐观锁确保线程安全,采用Node和Index节点实现并发操作。其内部使用volatile保证可见性,查找数据时,当Index节点的down引用为null时,会沿着Node链表查找目标key。
摘要由CSDN通过智能技术生成

TreeMap、ConcurrentSkipListMap的关系

TreeMap是支持key有序排列的一个key-value数据结构,不过是在单线程情况下使用,并发下不是线程安全的。ConcurrentSkipListMap是基于跳表的实现,也是支持key有序排列的一个key-value数据结构,在并发情况下表现很好,是一种空间换时间的实现,ConcurrentSkipListMap是基于一种乐观锁的方式去实现高并发。



(这里借用一张网上的图片)

ConcurrentSkipListMap中用到了Node数据节点和Index索引节点的存储方式,通过volatile关键字实现了并发的操作。

static final class Node<K,V> {  
        final K key;  
        volatile Object value;//value值  
        volatile Node<K,V> next;//next引用  
        ……  
}  
static class Index<K,V> {  
        final Node<K,V> node;  
        final Index<K,V> down;//down引用  
       volatile Index<K,V> right;//right引用  
       ……  
}  

我们看Node数据,维护了一个next的Node节点,实现中全部的数据节点Node是一种链表的实现方式。Index节点则维护了当前Index节点的Node数据,以及Index的右引用和下引用。查找时Index节点当查到level=1时,即down引用为null时,就会根据当前的Index节点对应的Node节点的链表去查找key对应的数据。


下面从插入数据去看如何实现高并发

public V put(K key, V value) {  
    if (value == null)  
        throw new NullPointerException();  
    return doPut(key, value, false);  
}  
private V doPut(K kkey, V value, boolean onlyIfAbsent) {  
    Comparable<? super K> key =
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值