ThreadLocal、Thread、ThreadLocalMap之间的关系
1、ThreadLocalMap是ThreadLocal的静态内部类,查看ThreadLocal的structor结构如下:

2、
2.1、Entry[]数组是ThreadLocalMap的成员变量,每个Entry就是就是键-值对的封装
注意:Entry的k值就是ThreadLocal实例,那么当ThreadLocal实例不存在强引用时,就可能会被GC回收,此时就可能发生内存泄漏

2.2、Entry类是ThreadLocalMap的静态内部类,代码如下:
static class ThreadLocalMap { static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { //super(k)证明了针对k的引用为弱引用,那么k被回收后,调用Reference#get()方法则返回空 super(k); value = v; } } ... }
3、ThreadLocalMap实例就是Thread的成员变量值,查看ThreadLocal代码如下
//线程的threadLocals属性值在ThreadLocal的createMap中创建 void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }
思考:
Thread的成员变量是ThreadLocalMap实例,那么在一个线程中,threadLocalMap的数量什么时候大于1
答:在一个线程中如果只创建了一个ThreadLocal实例,那么此时ThreadLocalMap的副本数据数量等于1
在一个线程中如果创建了多个ThreadLocal实例,那么此时ThreadLocalMap的副本数据数量则大于1

浙公网安备 33010602011771号