ConcurrentHashMap源码

简介: ConcurrentHashMap源码

公众号merlinsea


背景  

    ConcurrentHashMap的出现目的就是为了解决HashMap在多线程环境下可能出现线程不安全问题。这里的线程不安全都是指的单JVM环境下的多线程操作!

 

  JDK8之前,ConcurrentHashMap使⽤锁分段技术,将数据分成⼀段段存储,每个数据段配置⼀把锁,即segment类,这个类继承ReentrantLock来保证线程安全;技术点:Segment+HashEntry


   JKD8的版本开始取消Segment这个分段锁数据结构,底层也是使⽤Node数组+链表+红⿊树,从⽽实现对每⼀个节点加锁,也减少了并发冲突的概率,CAS(保证读的线程安全性)+Synchronized(保证写的线程安全性) ;技术点:Node+Cas+Synchronized


总结put操作:


1、判断keyvalue是否为空,为空直接抛出空指针异常。

2、进行二次hash,得到hash值(二次hash目的在于hash效果更佳)。

3、判断table中对应的hash位置是否有元素,没有直接插入。

4、如果有元素,那么把这个Node节点作为锁对象传入syncronized。

5、如果是链表,那么按链表方式进行插入(找到相同的key就替换(不会发生链转树),否则进行尾插法(可能发生链转树))。

6、如果是红黑树,那么按照红黑树的方式进行插入。

7、最后判断是否需要链转红黑树。

   注意: 插入操作采取的是尾插法,因为在put操作的时候会锁住头节点。

640.jpg


get操作


640.jpg


相关文章
|
6月前
|
存储 安全 Java
|
6月前
ConcurrentHashMap源码学习
ConcurrentHashMap源码学习
49 1
|
存储 机器学习/深度学习 算法
源码剖析之ConcurrentHashMap
​ JDK8中ConcurrentHashMap的结构是:数组+链表+红黑树。 ​ 因为在hash冲突严重的情况下,链表的查询效率是O(n),所以jdk8中改成了单个链表的个数大于8时,数组长度小于64就扩容,数组长度大于等于64,则链表会转换为红黑树,这样以空间换时间,查询效率会变O(nlogn)。 ​ 红黑树在Node数组内部存储的不是一个TreeNode对象,而是一个TreeBin对象,TreeBin内部维持着一个红黑树。 ​ 在JDK8中ConcurrentHashMap最经点的实现是使用CAS+synchronized+volatile 来保证并发安全
120 0
源码剖析之ConcurrentHashMap
|
安全 数据安全/隐私保护
ConcurrentHashMap
ConcurrentHashMap
74 0
|
缓存 安全 Java
ConcurrentHashMap源码解读
ConcurrentHashMap源码解读
ConcurrentHashMap源码解读
|
存储 安全 Java
ConcurrentHashMap解析
ConcurrentHashMap解析
|
存储 安全 Java
JDK1.8中的ConcurrentHashMap源码分析
JDK1.8中的ConcurrentHashMap源码分析
JDK1.8中的ConcurrentHashMap源码分析
|
安全 Java
JDK1.8 中 ConcurrentHashMap源码分析(二)元素添加是线程安全的
本文是博主学习JDK源码的记录,此为ConcurrentHashMap源码分析(二),希望对大家有所帮助。
99 0
JDK1.8 中 ConcurrentHashMap源码分析(二)元素添加是线程安全的
|
安全 容器
Hashtable源码分析(基于jdk1.8,推荐)
Hashtable也算是集合系列中一个比较重要的集合类了,不过在介绍Hashtable的时候,总是不可避免的谈到HashMap,在面试的时候Hashtable往往也会结合HashMap一块来问。这篇文章就来好好地分析一下Hashtable
152 0
Hashtable源码分析(基于jdk1.8,推荐)
|
存储 缓存 安全
Java并发编程 - HashMap & ConcurrentHashMap 解析
Java并发编程 - HashMap & ConcurrentHashMap 解析
90 0
Java并发编程 - HashMap & ConcurrentHashMap 解析