Thread、ThreadLocal、ThreadLocalMap之间的关系

125 阅读2分钟

关系图

内部类关系

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 来获取值和设置值

Map结构和HashMap的区别

Hash冲突问题

弱引用内存泄漏问题

内存溢出问题