Java集合系列-ConcurrentHashMap-put方法的全面解析

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。

本篇文章主要对put方法做一个全面的理解,里面牵涉到很多的内容,也有很多理解不到位的地方,put方法我读源码前几遍时,对大致的脉络理解了,但是对里面比较细节的处理逻辑和判断通过一遍一遍的读和理解,才有点明白,然后把它写出来和大家分享,如有错误欢迎指正,使我们共同进步,此篇文章较长,请耐心看完,但是此篇文章对扩容和线程安全的内容一笔带过,这两个重要的内容,我有专门的文章去分析。

本篇文章的主要内容如下:

1:ConcurrentHashMap的put方法(重点讲解)
2:ConcurrentHashMap的计算hash值的方法spread()
3:ConcurrentHashMap的初始化方法:initTable()
4:ConcurrentHashMap的帮助扩容方法helpTransfer()
5:ConcurrentHashMap的标识符方法resizeStamp()
6:解密很多人对:(sc >>> RESIZE_STAMP_SHIFT) != rs || sc == rs + 1 ||
sc == rs + MAX_RESIZERS || transferIndex <= 0的疑惑
一、ConcurrentHashMap的put方法
相对于HashMap的put方法,ConcurrentHashMap的put方法稍微复杂一点,但是如果细心的去研读,还是可以理解的。接下来我们就一起走进put方法的源码,看一下它是怎样设计的。

public V put(K key, V value) {
//直接调用putValue方法
return putVal(key, value, false);
}
//这个方法的参数
1:key:键值对的key
2:value:键值对的value
3:onlyIfAbsent:如果为true,将不能覆盖已存在key的值。
4:evict:在HashMap中存在,但是没有实际意义,在ConcurrentHashMap中就不存在这个参数了。
final V putVal(K key, V value, boolean onlyIfAbsent) {
//这一步可以看到:ConcurrentHashMap不允许null值null键,否则将抛出空指针异常。
if (key == null || value == null) throw new NullPointerException();
//$1:这一步:获取key的hash值
int hash = spread(key.hashCode());
//binCount:表示
int binCount = 0;
//$2:这一步:一个无限循环,
for (Node<K,V>[] tab = table;😉 {
Node<K,V> f; int n, i, fh;
if (tab == null || (n = tab.length) == 0)
//$3:这一步:判断底层数组未初始化,开始调用初始化,稍后分析
tab = initTable();
//$4:这一步:说明已经初始化了,计算出key所在的下标是否有值
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
//$5:这一步:利用CAS原子性的添加到数组中。
if (casTabAt(tab, i, null,
new Node<K,V>(hash, key, value, null)))
//插入成功,则跳出循环,插入失败:继续循环。
break; // no lock when adding to empty bin
}
//这一步:MOVED=-1,是在ForwardingNode中出现的,说明正在扩容
else if ((fh = f.hash) == MOVED)
//$6:这一步:帮助扩容
tab = helpTransfer(tab, f);
else {
V oldVal = null;
//$7:这一

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值