ThreadLocal原理解析以及内存泄露问题

 

ThreadLocal实现原理:

  1. 每个Thread对象持有一个ThreadLocalMap属性;
  2. ThreadLocalMap是一个以ThreadLocal对象为Key,以业务对象为Value的Map
  3. 这样实现了不同Thread的数据隔离

 

ThreadLocal原理解析以及内存泄露问题_第1张图片

 

 

ThreadLocal原理解析以及内存泄露问题_第2张图片

 

 

ThreadLocal内存泄露场景:

  1. 使用线程池时某些线程的生命周期会很长;
  2. 如果执行ThreadLocal = null逻辑,因为ThreadLocalMap的Entry对象持有的是ThreadLocal对象的弱引用,因此垃圾回收时ThreadLocal对象会被回收掉;
  3. 但是Entry持有的是业务对象Value的强引用,因为Key已经变成了null,所以这个Entry不会被查询到但是会一直存在Map里,就导致了内存泄露

解决方法:

使用完ThreadLocal之后调用ThreadLocal.remove()方法可以将这个业务对象Value的Entry从ThreadLocalMap中remove掉,下次垃圾回收时会被回收掉

你可能感兴趣的:(Java,多线程,java,多线程,并发编程,内存泄漏)