ThreadLocal 源码分析
类定义
首先看 ThreadLocal 的类定义上,是带有泛型标注的,说明 ThreadLocal 可以存储任意类的数据。
ThreadLocal 的属性:
threadLocalHashCode 表示当前 ThreadLocal 的 hashCode,主要用于计算当前 ThreadLocal 对象 在 ThreadLocalMap 中的索引位置
nextHashCode() 主要是用于计算 ThreadLocal 对象 的 hashCode 值
nextHashCode 属性使用了 static 修饰,并且数据类型是 AtomicInteger,首先 AtomicInteger 保证了每个 ThreadLocal 的 threadLocalHashCode 是唯一的,当然这必须得在不同 JVM 中;其次 static 可以使得在同一时刻,多个 ThreadLocalMap 被 set 到 ThreadLocal 时,需要使用到 threadLocalHashCode 进行唯一区分
ThreadLocalMap 中的 Entry 表示数组中的每个节点值,继承了 WeakReference,表示当前对象在没有引用指向时,进行 JVM 垃圾回收时就会被回收掉
ThreadLocalMap 的数组的初始化大小为 16,扩容的初始阈值是数组大小的三分之二
ThreadLocalMap 的 set 方法
int i = key.threadLocalHashCode & (len-1);
表示计算 key 在数组中的下标,其实就是 ThreadLocal 的 hashCode 和数组大小-1 取余
for 循环数组进行处理时 tab[i],首先查看 i 索引位置有没有值,有值的话,索引位置 + 1,直到找到没有值的位置
e = tab[i = nextIndex(i, len)])...
nextIndex 就是让在不超过数组长度的基础上,把数组的索引位置 + 1
if (k == key) { e.value = value; return; }
找到内存地址一样的 ThreadLocal,直接替换
if (k == null) { ... }
判断当前 key 是否是 null,是则说明 ThreadLocal 被清理了,直接替换掉
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/a7033cef1f79f74ee585a0a77】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论