不恰当的使用 ThreadLocal 会造成内存泄漏的问题。主要是因为线程的私有变量ThreadLocalMap 里面的key是一个弱引用。而弱引用的特性就是不管是否存在直接引用的关系,当成员变量 ThreadLocal没有其他强引用关系的时候,这个时候对象就会被GC回收。从而导致key会变为null, 造成这块内存永远无法被访问,出现内存泄漏的问题。 规避 内存泄漏 的问题,我认为有两个解决方案。第一个是扩大成员变量ThreadLocal的作用域,避 免被GC回收。第二个就是每次使用完ThreadLocal以后,就调用remove()方法去移除对应的数据。 第一种解决方案虽然不会造成key为null的现象,但是后续线程不在继续访问这个key,也就会导致这 个内存一直占用不被释放,最后也会造成 内存溢出 的问题。所以说最好的解决方式,是在实际使 用完以后,调用remove()方法去移除这个数据。