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添加到计数中,为下次调整做准备。

目录
相关文章
|
6天前
|
存储 缓存 安全
ConcurrentHashMap:使用方法和底层原理详解
ConcurrentHashMap:使用方法和底层原理详解
36 1
|
6天前
|
设计模式 存储 缓存
LinkedHashMap源码学习
LinkedHashMap源码学习
LinkedHashMap源码学习
|
6天前
|
安全 Java
【JDK 源码分析】HashMap 线程安全问题分析
【1月更文挑战第27天】【JDK 源码分析】HashMap 线程安全问题分析
|
6天前
|
安全 Java 索引
认真学习jdk1.7下ConcurrentHashMap的实现原理
认真学习jdk1.7下ConcurrentHashMap的实现原理
67 0
|
6天前
|
机器学习/深度学习 存储 Java
认真学习jdk1.8下ConcurrentHashMap的实现原理
认真学习jdk1.8下ConcurrentHashMap的实现原理
37 0
认真学习jdk1.8下ConcurrentHashMap的实现原理
|
10月前
|
存储 安全 Java
ConcurrentHashMap源码
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的次幂。
52 0
HashMap源码学习
|
存储 算法 Java
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(上)
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(上)
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(上)
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(下)
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(下)
Java集合源码剖析——基于JDK1.8中HashMap的实现原理(下)