ConcurrentMap

在学习livy源码过程中,发现其代码使用ConcurrentMap,自己不太理解,搜索之后,特意记录一下,以便回顾。原文请看这里

ConcurrentMap接口  、 ConcurrentHashMap类  :

    ConcurrentHashMap是一个线程安全的哈希表,他的主要功能是提供一组和HashMap功能相同但是线程安全的方法。ConcurrentHashMap做到读取数据不加锁,而其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持的尽量的小,而不用对整个ConcurrentHashMap枷锁

    工作原理:

    ConcurrentHashMap为例提高本身的并发能力,在内部采用了一个叫做Segment的结构,一个Segment其实就是一个类似HashTable的结构,Segment内部维护了一个链表数组,下面这幅图展示了ConcurrentHashMap的内部结构:   ConcurrentMap_第1张图片

    从图中,我们可以了解到,ConcurrentHashMap定位一个元素的过程需要进行两次Hash操作,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部。因此,这样的结构带来的缺点就是Hash的过程要比普通的HashMap要长,但是带来的好处就是写操作的时候可以支队元素所在的Segment进行加锁即可,不会影响到其他的Segment。这样,在最理想的情况下,ConcurrentHashMap可以最高同时支持Segment数量大小的写操作(刚好这些写操作都非常平均的分布在所有的Segment上),所以,通过这一结构,ConcurrentHashMap的并发能力可以大大的提高。

    推荐使用的方法: V putIfAbsent(K key, V value) :  如果指定键已经不再与某个值相关联,则将key与value加入。即实现只有当ConcurrentHashMap中不存在该键时,才将键值对加入ConcurrentHashMap中。  返回值:如果键值对已存在,则返回原值,否则返回null


你可能感兴趣的:(livy)