ThreadLocal的理解,带有个人主观色彩

 1.    Thread是线程类, 他保存本地副本的变量有2个, 一个是inheritableThreadLocals(这个子线程有关,子线程访问父线程的本地变量,暂且不说),一个是关注的threadLocals。
    每个线程都是操作的自己的threadLocals

 2. 

    当我们操纵ThreadLocal的时候,其实是操做的thread的变量。 

    也就相当于你拿个钳子(ThreadLocal)拧机器(Thread)上的螺丝(threadLocals)。

    

 3.    内存泄露:不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。 或者偏激的说,不需要了却还存在。

    弱引用:JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象

    

    我们来分析下ThreadLocal的内存泄露,

    首先thread类有变量threadLocals,它的类型是ThreadLocalMap,  ThreadLocalMap 是用一个entity保存的, 其中key为线程的ThreadLocal,value是你保存的值。

    我们之所以不用强引用,是因为有时候可能不需要了,假设我们已经删除了ThreadLocal。但由于它还被另一个地方(Entry)引用着,无法回收。如果没有手动删除,ThreadLocal不会被回收,导致Entry内存泄漏。

    用了弱引用就解决了该问题。

    但还有一个问题没解决,虽然key没事了,成了null, 但是value还是真实的对应着某个堆,也就造成了内存泄漏。

    来源网络:当不存在做remove的时候,一个线程执行完,就会形成一个引用链:线程对象中有个成员引用threadmap,map中有个entity对象的引用,这个entity对象里面有个成员value,引用着真实的线程中产生的对象,然后就有了内存泄露

    ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用

    

java子线程使用父线程变量 threadlocal子线程父线程_开发语言


    

4. 每次使用完ThreadLocal都调用它的remove()方法清除数据