Java8中ConcurrentHashMap的结构
桶里的结构 : Node<K,V>
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
网友评论