一.ThreadLocal介绍
ThreadLocal是线程内部的数据存储类,只有当前线程才能读取其中的数据,因此不存在线程安全问题。
ThreadLocal内部有一个ThreadLocalMap类,使用Thread存储数据时,实际使用的ThreadLoaclMap存储。
二.ThreadLocal内存泄漏
ThreadLocalMap使用ThreadLocal的弱引用作为key,如果一个ThreadLocal没有外部强引用,那么只要发生了GC就一定会回收ThreadLocal,也就是说ThreadLocalMap中的key为null,但是value不为空,如果当前Thread一直不结束,那么就存在对value的强引用链,造成内存泄漏。
在ThreadLocalMap进行get(),set()或者remove()时都会清除所有key为null的value。
但是如果ThreadLocal被static修饰,或者不调用get,set和remove等方法时,会造成内存泄漏。