博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java | JDK8下的ConcurrentHashMap#putValue
阅读量:4593 次
发布时间:2019-06-09

本文共 3181 字,大约阅读时间需要 10 分钟。

 
1  /** 2       key:键值 3       value:值 4       onlyIfAbsent:true:如果key存在的情况下,不更新值;Flase:如果key存在的情况下,替换old value 5   **/ 6   final V putVal(K key, V value, boolean onlyIfAbsent) { 7           //不允许key或value为空 8         if (key == null || value == null) throw new NullPointerException(); 9         //在key的hascode值上重新计算key的hash值10         //【(key.hashCode() ^ (key.hashCode() >>> 16)) & 0x7fffffff;】11         int hash = spread(key.hashCode());12         int binCount = 0;13         //CAS锁14         for (Node
[] tab = table;;) {15 Node
f; int n, i, fh;16 /**17 初始化18 根据hash确认key的Node位置,当node为空时则CAS尝试写入,写入成功流程结束,否则进行下一次尝试19 **/ 20 if (tab == null || (n = tab.length) == 0)21 tab = initTable();22 else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {23 if (casTabAt(tab, i, null,24 new Node
(hash, key, value, null)))25 break; // no lock when adding to empty bin26 }27 /**28 static final int MOVED = -1;29 如果当前位置的 hashcode == MOVED == -1, map 正在扩容,其他线程帮助扩容,也就是多线程扩容。30 **/31 else if ((fh = f.hash) == MOVED)32 tab = helpTransfer(tab, f);33 else {34 /**35 利用 synchronized 锁写入数据36 fh〉0 说明这个节点是一个链表的节点不是树的节点。37 如果是红黑树,照树的方式插入值 38 **/39 V oldVal = null;40 synchronized (f) {41 if (tabAt(tab, i) == f) {42 if (fh >= 0) {43 binCount = 1;44 //遍历链表所有结点,如果找到相同key就更新旧值,否则添加至链表尾45 for (Node
e = f;; ++binCount) {46 K ek;47 if (e.hash == hash &&48 ((ek = e.key) == key ||49 (ek != null && key.equals(ek)))) {50 oldVal = e.val;51 if (!onlyIfAbsent)52 e.val = value;53 break;54 }55 Node
pred = e;56 if ((e = e.next) == null) {57 pred.next = new Node
(hash, key,58 value, null);59 break;60 }61 }62 }63 else if (f instanceof TreeBin) {64 Node
p;65 binCount = 2;66 if ((p = ((TreeBin
)f).putTreeVal(hash, key,67 value)) != null) {68 oldVal = p.val;69 if (!onlyIfAbsent)70 p.val = value;71 }72 }73 }74 }75 /**76 当链表长度大于8时,将链表转换为红黑树77 **/78 if (binCount != 0) {79 if (binCount >= TREEIFY_THRESHOLD)80 treeifyBin(tab, i);81 if (oldVal != null)82 return oldVal;83 break;84 }85 }86 }87 //如果是新增元素,将当前ConcurrentHashMap的元素数量+188 addCount(1L, binCount);89 return null;90 }

 

转载于:https://www.cnblogs.com/jj81/p/11479222.html

你可能感兴趣的文章
iptables详解
查看>>
习题2-6排列(permutation)
查看>>
Mybatis基本配置(一)
查看>>
Android攻城狮布局动画
查看>>
正则表达式零宽断言详解(?=,?<=,?!,?<!)
查看>>
20145205 《Java程序设计》实验报告三:敏捷开发与XP实践
查看>>
利用Spring.NET实现WCF的AOP编程
查看>>
第三方,解决模型无法在获取网络数据之后传值问题
查看>>
对比 Git 与 SVN,这篇讲的很易懂
查看>>
【snmp】Linux开启snmp及查询
查看>>
CSU 1532: JuQueen(线段树)
查看>>
设定MyEclipse编辑代码区域文字的大小及非keyword的字体、字形和颜色
查看>>
LeetCode【6】. ZigZag Conversion --思路图解与java实现
查看>>
git 合并分支
查看>>
NSNotification与NSNotificationCenter
查看>>
qt 中文乱码 处理QByteArray类型里含中文的数据
查看>>
跨库事务一致性问题的解决方式(例)
查看>>
ios build时,Undefined symbols for architecture xxx问题的总结
查看>>
JavaScript对象
查看>>
南理第八届校赛同步赛-C count_prime//容斥原理
查看>>