关系图
内部类关系
Thread:当前线程类,Thread.threadLocals 属性为ThreadLocal.ThreadLocalMap
ThreadLocalMap:即threadLocals ,所有的ThreadLocal和其对应的Entry都在里面
ThreadLocal:通常定义在代码中的静态属性,可以以此为key去ThreadLocalMap中取对象
使用原理:
1、创建ThreadUtil,ThreadLocal设为static是为了防止弱引用导致的内存泄漏,当Thread为null时设置新值
2、获取当前线程 t
3、getMap(t) 返回 ThreadLocalMap 即Thread.threadLocals
4、如果ThreadLocalMap为空则新建,key就是当前类(LOCAL_JSON),所以ThreadLocalMap里会存当前线程的多个对象(T)
5、然后是get方法,从threadLocals中取出当前线程的ThreadLocalMap,然后再从当前ThreadLocalMap中取出当前对象对应的Entry
问:ThreadLocalMap设计为ThreadLocald 内部类
翻译:ThreadLocalMap是一个定制的哈希映射,只适用于维护线程本地值。没有操作被导出到ThreadLocal类之外。这个类是包私有的,允许在类Thread中声明字段。为了帮助处理非常大且长期的使用,散列表项使用WeakReferences作为键。但是,由于没有使用引用队列,所以只有在表空间开始用完时才保证删除过时的表项。
主要说明ThreadLocalMap是一个线程本地的值,它所有的方法都是private 的,也就意味着除了ThreadLocal 这个类,其他类是不能操作ThreadLocalMap 中的任何方法的。同时这个类的权限是包级别的,也就意味着只有同一个包下面的类才能引用ThreadLocalMap 这个类,这也是Thread 为什么可以引用ThreadLocalMap 的原因,因为他们在同一个包下面。
虽然Thread 可以引用ThreadLocalMap,但是不能调用任何ThreadLocalMap 中的方法。这也就是我们平时都是通过ThreadLocal 来获取值和设置值