2020-08-08:ConcurrentHashMap学习

Java8中ConcurrentHashMap的结构

桶里的结构 : Node

ForwardingNode : 头节点,类似哨兵的功能吧? 

ConcurrentHashMap中的原子操作

全部用的时Unsafe的方法,这个Unsafe方法要了解下

ConcurrentHashMap的功能实现

1.ConcurrentHashMap初始化

重要的参数sizeCtl :初始化和扩容都有用到 ;PS:含义丰富,

CHM的初始化,只是初始化参数; table的初始化是在put第一个元素时进行


2.ConcurrentHashMap的put方法

onlyIfAbsent 用来控制Node节点key,hashCode相同时,是否进行value替换。 true:不替换; false:替换。

实验: 

ConcurrentHashMap cmap =new ConcurrentHashMap();

cmap.put("1","1");

cmap.put("1","2");

cmap.put("1","3");

然后调用get("1");  结果是:3;

结论: 默认情况下,onlyIfAbsent  为true; 多次put同一个key,会产生多个Node;但是只能访问最后一个put的Node;

当桶内节点达到8个,会由链表转为红黑树

ConcurrentHashMap的扩容机制


ConcurrentHashMap的get方法

当存在key不同但hashcode相同的节点时,调用get方法会遍历所以在桶下的所有Node;





参考链接: https://blog.csdn.net/programerxiaoer/article/details/80040090

你可能感兴趣的:(2020-08-08:ConcurrentHashMap学习)