ThreadLocal replaceStaleEntry() 流程
2023-07-14 22:11:13 2 举报
ThreadLocal replaceStaleEntry() 清理过期 key 流程
作者其他创作
大纲/内容
Entry[4]
否
是
更新 slotToExpunge
key:TL3value:15
10
2
8
15
1
14
6
7
12
从 staleSlot 下一个位置开始,向后查找直到 entry 为 null
key:nullvalue:6
初始化 slotToExpunge = staleSlot
key:TL3value:4
向后查找遇到 key 也为 TL3
3
staleSlot:传入的参数,表示当前过期 key 的下标位置slotToExpunge:探测式清理过期数据的开始下标
4
是否找到 key 为 null 的过期数据
是(说明当前 key 为过期数据)
执行清理逻辑
交换位置
先启动探测式清理 expungeStaleEntry(),再启动启发式清理 cleanSomeSlots()
5
遇到 key 为null ?
说明只有 staleSlot 位置为过期数据,而该位置又被新对象占用了,所以不用清理了
查找是否结束
结束
说明遇到 entry 为 null,则创建对象,放到 staleSlot 位置
slotToExpunge 是否等于 staleSlot
否(继续向前查找)
Entry[7]
是(更新逻辑)
遇到 key 为当前 key?
否(继续向后查找)
staleSlot = 4slotToExpunge = 4
先更新 value,然后交换到 staleSlot 位置
staleSlot = 4
更新staleSlot = 6
从 staleSlot 上一个位置开始,向前查找直到 entry 为 null
更新 value
slotToExpunge 等于 staleSlot ?
0 条评论
下一页