ThreadLocalMap详情
2021-11-15 05:08:37 0 举报
ThreadLocalMap工作流程
作者其他创作
大纲/内容
遍历找下一个元素
失效
不为空
a 无
1.先执行一次内部:探测式清理
size >= threshold - threshold / 4也就是size >= threshold* 3/4
同时也记录失效位:1. 当前置查找中已有失效则忽略,清理位=前置失效位2. 前置没有 则将清理位 重置为初始与相等元素/null之间第一个其它的失效位只有当清理位=还等于初始值 没有重置,并且不存在key时(不用清理,直接结束)
2.再执行外部:启发式清理循环len或size的2次幂数,进行探测式清理 while( (n >>>= 1) != 0); 每次循环把上次探测式的结束位 作为下次的 开始位 继续向后迭代,再做探测式清理
进行清理清理位=当前桶位i
结束
③:判断k==null是否失效
返回value(结束)
替换value
2.启发式清理(1.探测式清理)
返回结束null位下标,做为外部清理的 开始位;循环(length的2次幂数)次 n=length
初始失效位
不存在
创建新元素添加 插入到当前位
不等
主要是为了 设置探测式清理的 开始位(如果有重置初始失效位)
进行清理清理位=最前失效位
直到NULL为止
清理失效数据遍历整个数组进行探测式清理
详情
标记:初始失效下标=当前下标i1.向前一直迭代查找失效的桶位,直到null结束,靠前的失效位置 为 清理开始位2.向后一直迭代查找存在key的桶位,直到null结束,期间同样也记录失效位,共同保证清理开始位。
大于
没失效 循环向后找下个元素i+1
开始位:null位 即插入位循环(size的2次幂数)次 n=size
数组size是否>=len的1/2
为空
a/b 有
中途有失效元素
则执行一次探测式清理
小于
直接结束
启发式清理
直到等于NULL为止
2.再向后一直找与key相等的元素
找到相等的key
a. 没有找到(key不存在), 则创建新元素 直接插入到初始失效位,然后比较失效位有无变化无:直接结束(及无其他失效数据,则无需清理)有:则从最前位开始 进行清理逻辑
循环:(探测式清理) 过程:从清理位向后遍历直到null为止 1.将这之间所有的失效位数据置为null 2.同时移动hash冲突不对应下标的位桶元素,移动置失效位 (前移-拉近hash对应位) 经过迭代后,有过Hash冲突数据的Entry位置会更靠近正确位置,这样的话,查询的时候 效率才会更高。
循环次数:len或size的2次幂数
数组size是否>=len的2/3
根据hash找到对应下标
无
扩容逻辑 rehash();
b.找到(key存在)替换value,并与初始失效位 交换位置,然后判断有无其他失效位,确定清理位,进行清理逻辑无:从当前桶位i(交换的位置) 清理有:从最前位开始进行清理
b 无
②:判断k==key是否存在
真扩容len * 2初始len=16 始终是2的幂数 便于取模
相同
存在
①:i=h Entry[i]是否为空
判断有无其它失效位
NULL
set开始
判断k==key是否相同
有清理到数据
1.先向前查找是否还有 其他失效位
get开始
收藏
收藏
0 条评论
下一页