ThreadLocal实现原理:
- 每个Thread对象持有一个ThreadLocalMap属性;
- ThreadLocalMap是一个以ThreadLocal对象为Key,以业务对象为Value的Map
- 这样实现了不同Thread的数据隔离
ThreadLocal内存泄露场景:
- 使用线程池时某些线程的生命周期会很长;
- 如果执行ThreadLocal = null逻辑,因为ThreadLocalMap的Entry对象持有的是ThreadLocal对象的弱引用,因此垃圾回收时ThreadLocal对象会被回收掉;
- 但是Entry持有的是业务对象Value的强引用,因为Key已经变成了null,所以这个Entry不会被查询到但是会一直存在Map里,就导致了内存泄露
解决方法:
使用完ThreadLocal之后调用ThreadLocal.remove()方法可以将这个业务对象Value的Entry<ThreadLocal, 业务对象>从ThreadLocalMap中remove掉,下次垃圾回收时会被回收掉