ThreadLocal
ThreadLocal、ThreadLocalMap、Thread、Entry
Thread 持有 ThreadLocalMap
ThreadLocalMap 内部存储是 Entry[]
Entry[] 初始长度 16, 使用长度超过1/2时扩容
Entry[]的索引是 ThreadLocal的 hashcode & (len-1)为初始值,如果已经被占用,则往后循环。没有则存储对应的Entry。
Entry 的key是 ThreadLocal, value是对应的值。
Entry extends WeakReference 弱引用,gc时ThreadLocal回被回收
set方法
ThreadLocal.threadLocalHashCode & (len-1) 为初始index,在Entry[]往后循环寻找坑位
如果Entry为null,则初始化值
如果Entry.key 为null,则是弱引用被回收,则重新实例化Entry
如果Entry和Entry.key都不为null,则替换值
get方法
类似set,ThreadLocal被回收之后重新初始化并返回null
扩容
Entry[]长度超过2/3时触发rehash,清理被gc回收的ThreadLocal
Entry[]长度超过1/2时resize,
本文详细解析了ThreadLocal的工作原理,包括其内部结构如ThreadLocalMap和Entry,以及关键方法set和get的实现过程。探讨了弱引用在Entry中的作用,以及如何通过hashcode和扩容策略避免内存泄漏。
9602

被折叠的 条评论
为什么被折叠?



