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

 

posted @ 2023-12-03 12:48  西风51668  阅读(46)  评论(0)    收藏  举报