视频
这里用binCount来记录遍历次数,因为遍历是从0开始的,所以当binCount>=TREEIFY_THRESHOLD-1就可以了认为是可以树化了。
MAXIMUM_CAPACITY
,同时oldCap大于等于DEFAULT_INITIAL_CAPACITY
DEFAULT_INITIAL_CAPACITY
(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
ft = (float)newCap * loadFactor;
newThr = (newCap < MAXIMUM_CAPACITY && ft < (float)MAXIMUM_CAPACITY ? (int)ft : Integer.MAX_VALUE);
初始时只有第一个segment会初始化两个hashentry,后面的是不会被初始化的,只有在用到才会被初始化
- sizeCtl为0,表示数组未初始化,且数组初始化容量为默认值16
- sizeCtl为正数,如果数组未初始化,那么sizeCtl表示的是数组的初始化容量。如果已经初始化,则表示数组的扩容阈值。
- sizeCtl为-1,表示数组正在进行初始化。
- sizeCtl为小于0,表示数组正在扩容,其值为-(n-1)时,表示有n个数组正在扩容,共同完成对数组的扩容。
initialCapacity
,而是initialCapacity + (initialCapacity >>> 1) + 1
,因此得出的表格长度正常的2倍。addCount(long x, int check)维护集合长度
这个就不贴代码了,太难了,就放个逻辑在这里吧。
我们首先对baseCount进行CAS操作,操作成功,直接返回,如果操作失败,对CounterCell数组的Value尝试增加,如果还失败进入fullAddCount(x, uncontended);
在fullAddCount(x, uncontended);中,就是不断的自旋的在数组中的人一位置进行加1,如果CAS成功,则返回;如果失败,尝试对数组进行扩容,同时继续尝试随机位置加,直到加成功。CounterCell数组的长度最大为CPU的核心数。
每一次如果都CAS失败,则会找一个新的数组位置加,直到加成功
则最终的HashMap的总长度为:baseCount + CounterCell_value + CounterCell_value+…+