ThreadLocal
一、4种引用
强:垃圾回收正常回收
软:内存不够时才会回收,做缓存用
弱:gc就会回收,ThreadLocal中ThreadLocalMap里的entry使用的就是弱引用
虚:回收时会收到一个通知,管理堆外内存使用
二、ThreadLocal的继承
不会被子线程继承,想要被子线程继承,需要使用InheritableThreadLocal,会继承父线程的ThreadLocal值,但是与线程池一起使用时,由于线程池中的线程与原线程不一定存在父子关系,这一点需要注意。
三、ThreadLocal的内存泄露
当thread是一个长时间运行的线程,并且原本的ThreadLocal引用被指向null或者其他ThreadLocal时,原先堆中的ThreadLocal只剩一条entry中的key指向的弱引用,在gc时被回收,而当前thread存在一个ThreadLocalMap的强引用指向entry,导致entry中的value不会被回收,
而此时key已经为null,无法获取到value,这时就出现了内存泄露。

然而ThreadLocalMap的每次get、set、remove,都会清理过期的Entry,因此正常情况下,是不会发生内存泄露问题的。

浙公网安备 33010602011771号