ThreadLocal是什么
ThreadLocal是Java用来实现线程间数据隔离的机制,他会给每个线程创建共享变量的副本,这样就能保证对该共享变量的修改不会影响到其他线程。他可以使用
get()和set()方法来获取默认值或者将值修改为当前线程所持有的变量值,从而避免了线程安全问题。
ThreadLocal的原理
每一个线程内部都有一个ThreadLocalMap 类型的对象,可以将其理解为一个定制化的HashMap,ThreadLocalMap 由一个个Entry 构成,Entry 可以存储以ThreadLocal 为key ,Object 为value 的键值对,最终被存放在当前线程内部的ThreadLocalMap 中,每个线程的Map 都是不一样的,各自存储各自的变量,这就实现了隔离。
ThreadLocal内存泄露问题
ThreadLocalMap 的Entry 中,key 是对ThreadLocal 对象t1 的弱引用,当程序中其他代码中不再持有该ThreadLocal 对象t1 的任何强引用时,在下一次GC发生的时候,这个ThreadLocal 对象 t1 就可以被回收,此时对应Entry中的key 会被自动设置为null,这样ThreadLocalMap中就会出现key为null的Entry ,假如我们不做任何措施,value 永远无法被GC回收,这时候就可能产生内存泄露。
ThreadLocalMap 的实现中考虑了这些情况,在调用set()、get()、remove() 方法时,会清楚掉key 为null 的记录,但是仍推荐手动remove()