深入解析ThreadLocal(11)

< len) ? i + 1 : 0);}代码执行流程:
A. 首先还是根据key计算出索引 i , 然后查找i位置上的Entry ,
B. 若是Entry已经存在并且key等于传入的key , 那么这时候直接给这个Entry赋新的value值,
C. 若是Entry存在 , 但是key为null , 则调用replaceStaleEntry来更换这个key为空的Entry,
D. 不断循环检测 , 直到遇到为null的地方 , 这时候要是还没在循环过程中return , 那么就在这个null的位置新建一个Entry , 并且插入 , 同时size增加1 。
最后调用cleanSomeSlots , 清理key为null的Entry , 最后返回是否清理了Entry , 接下来再判断sz 是否>= thresgold达到了rehash的条件 , 达到的话就会调用rehash函数执行一次全表的扫描清理 。
重点分析 : ThreadLocalMap使用线性探测法来解决哈希冲突的 。
该方法一次探测下一个地址 , 直到有空的地址后插入 , 若整个空间都找不到空余的地址 , 则产生溢出 。
举个例子 , 假设当前table长度为16 , 也就是说如果计算出来key的hash值为14 , 如果table[14]上已经有值 , 并且其key与当前key不一致 , 那么就发生了hash冲突 , 这个时候将14加1得到15 , 取table[15]进行判断 , 这个时候如果还是冲突会回到0 , 取table[0],以此类推 , 直到可以插入 。
【深入解析ThreadLocal】按照上面的描述 , 可以把Entry[] table看成一个环形数组 。


推荐阅读