
Java源码阅读
文章平均质量分 84
Seldon1224
一个热爱编程的学生党
展开
-
JDK1.8 CourrentHashMap中addCount的小bug
1. 扩容戳 每次扩容前,会调用resizeStamp函数以table容量为种子生成一个唯一的扩容戳。 static final int resizeStamp(int n) { return Integer.numberOfLeadingZeros(n) | (1 << (RESIZE_STAMP_BITS - 1)); // Integer.numberOfLeadingZeros 表示参数n的二进制表示,从左边开始算起,连续为0的个数 } 在扩容时,sizeCtl变量会用来原创 2021-10-03 23:40:42 · 297 阅读 · 0 评论 -
JDK1.8 ConcurrentHashMap源码阅读
ConcurrentHashMap解析 1. 源码分析 1.1 sizeCtl含义解释 sizeCtl为0, 代表数字未进行初始化,数组初始容量为16 sizeCtl为正数: 如果数组未初始化,其记录的是数组的初始容量 如果数组已进行初始化,其记录的是数组扩容的阈值(数组初始容量*0.75) sizeCtl为-1,表示数组正在进行初始化 sizeCtl小于0,并且不是-1,表示数组正在进行扩容,其中低16位表示并发扩容的线程数 1.2 数组初始化(解决并发问题 - CAS) priv原创 2021-10-03 23:22:31 · 197 阅读 · 0 评论 -
HashMap和LinkedHashMap源码阅读
HashMap和LinkedHashMap 1. HashMap 1.1 key值hash的计算 static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } int - 4字节共32位,用高16位与低16进行异或运算,充分利用hashCode函数返回的int值,降低了hash冲突的概率 默认容量1原创 2021-09-02 22:36:10 · 124 阅读 · 0 评论