ThreadLocal源码分析

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源码分析)