- ThreadLocal是基于ThreadLocalMap实现的,而ThreadLocalMap的静态成员变量Entry继承WeakReference,Entry的key是弱引用类型,弱引用类型会在下次gc被回收。当发生gc时,Entry的key被回收,而value值依然存在内存中.内存泄漏通过下面这条链路Thread --> ThreadLocalMap-->Entry-->Value,这条引用链会导致Entry不会回收,Value也不会回收。
- ThreadLocal不会发生内存泄漏的两个条件是:在使用完ThreadLocal后,及时调用remove()方法,将ThreadLocal从ThreadLocalMap中删除;在使用ThreadLocal时,保证线程结束时ThreadLocalMap中的所有Entry都被回收。
- 为了保证线程结束时ThreadLocalMap中的所有Entry都被回收,可以使用ThreadLocal的子类InheritableThreadLocal。InheritableThreadLocal是ThreadLocal的一个子类,它可以将父线程中的ThreadLocal变量传递给子线程。在InheritableThreadLocal中,每个线程都有自己的ThreadLocalMap,因此不会出现线程结束时ThreadLocalMap中的Entry没有被回收的情况
ThreadLocal是基于ThreadLocalMap实现的,而ThreadLocalMap的静态成员变量Entry继承WeakReference,Entry的key是弱引用类型,弱引用类型会在下次gc被回收。当发生gc时,Entry的key被回收,而value值依然存在内存中.内存泄漏通过下面这条链路Thread --> ThreadLocalMap-->Entry-->Value,这条引用链会导致Entry不会回收,Value也不会回收。 ThreadLocal不会发生内存泄漏的两个条件是:在使用完ThreadLocal后,及时调用remove()方法,将ThreadLocal从ThreadLocalMap中删除;在使用ThreadLocal时,保证线程结束时ThreadLocalMap中的所有Entry都被回收。 为了保证线程结束时ThreadLocalMap中的所有Entry都被回收,可以使用ThreadLocal的子类InheritableThreadLocal。InheritableThreadLocal是ThreadLocal的一个子类,它可以将父线程中的ThreadLocal变量传递给子线程。在InheritableThreadLocal中,每个线程都有自己的ThreadLocalMap,因此不会出现线程结束时ThreadLocalMap中的Entry没有被回收的情况