ConcurrentHashMap源码学习

简介: ConcurrentHashMap源码学习

实现接口

      ConcurrentMap(Map的基础方法)、Serializable(序列化)

基础属性

最大容量:2^30

默认容量:16

image.pngimage.gif

常用方法

PUT

调用PutVal方法进行插入。

判断key或value是否为空:

是:抛出空指针一场

否:将key的哈希值的上下16位进行异或,是哈希值更散列

       判断节点数组是否为空:

       是:初始化节点数组,并将容量恢复至默认容量16

       否:利用tabAt方法获取hash分配位置的值,如果节点值为null,则利用casTabAt方法将新节点插入到当前位置

       否:hash分配位置的Hash值为-1(转发节点),则调用helpTransfer方法(在调整大小中进行传输)

       否:onlyIfAbsent为true,hash分配位置的节点与插入节点的key相同,且value不为null,返回当前hash位置的value;

       否:给到当前位置节点加锁,判断当前位置节点是否改变

               否:当前位置的hash值是否大于等于0(表示正常节点哈希的可用位),寻找key是否已存在,已存在则判断onlyIfAbsent是否为false,寻找过程中binCount(链表深度)会随着每一次循环加1

                       是:将目标值替换旧值

                       break跳出循环;

                       不存在则将目标节点添加到末尾

               如果当前hash位置的节点是树类型的节点,调用putTreeVal方法来查找和插入节点(先判断节点是否存在,存在则返回节点,不存在则插入当前节点并返回null),返回值不为null则判断onlyIfAbsent是否为false

                       是:将目标值替换旧值

                       break跳出循环;

               如果当前hash位置的节点是ReservationNode类型则抛出异常

thrownewIllegalStateException("Recursive update")
image.gif

     如果binCount不等于0

               binCount大于8:将所有节点转换成树节点

               旧值(相同key)不为null,返回旧值。

调用account将binCount添加到计数中,为下次调整做准备。

目录
相关文章
|
7月前
|
存储 缓存 安全
ConcurrentHashMap:使用方法和底层原理详解
ConcurrentHashMap:使用方法和底层原理详解
203 1
|
1月前
|
存储 缓存 安全
ConcurrentHashMap的实现原理,非常详细,一文吃透!
本文详细解析了ConcurrentHashMap的实现原理,深入探讨了分段锁、CAS操作和红黑树等关键技术,帮助全面理解ConcurrentHashMap的并发机制。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
ConcurrentHashMap的实现原理,非常详细,一文吃透!
|
7月前
|
机器学习/深度学习 存储 Java
认真学习jdk1.8下ConcurrentHashMap的实现原理
认真学习jdk1.8下ConcurrentHashMap的实现原理
59 0
认真学习jdk1.8下ConcurrentHashMap的实现原理
|
7月前
|
安全 Java 索引
认真学习jdk1.7下ConcurrentHashMap的实现原理
认真学习jdk1.7下ConcurrentHashMap的实现原理
115 0
|
存储 安全 Java
ConcurrentHashMap源码
ConcurrentHashMap源码
|
存储 安全 算法
Java并发编程之ConcurrentHashMap源码分析
HashMap多线程put后get为null和多线程put的时候可能导致元素丢失 在多线程环境下,使用HashMap进行put操作时存在丢失数据的情况,为了避免这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap
253 0
Java并发编程之ConcurrentHashMap源码分析
|
缓存 安全 Java
ConcurrentHashMap源码解读
ConcurrentHashMap源码解读
ConcurrentHashMap源码解读
|
安全 Java
HashMap源码学习
线程上:HashMap是线程不安全的,而HashTable是安全的。key、value的支持:HashMap的key、balue可以为空,而HashTable是key、value不可以为空的。底层数据结构:HashMap采用数组+链表+红黑树,当链表的长度>=8的时候会考虑是否转成红黑树,而HashTable则没有。初始化容量上:HashTable的初始化容量是11,同时扩容变为原来的2n+1,HashMap的初始化容量是16,同时扩容扩容成原来的2倍。而当给定初始化容量时,HashTable是直接给定初始化容量,而HashMap是将给定的初始化容量变成2的次幂。
73 0
HashMap源码学习
|
安全 Java
Java并发编程解析,ConcurrentHashMap理解
Java并发编程解析,ConcurrentHashMap理解
123 0
Java并发编程解析,ConcurrentHashMap理解
|
存储 算法 Java
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(上)
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(上)
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(上)