ThreadLocal原理与内存泄露(Memory Leak)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MrLiar17/article/details/83144229

ThreadLocal原理:

ThreadLocal提供了线程内的局部变量,在这个线程运行的周期内,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。内部封装了ThreadLocalMap类,使用ThreadLocal的弱引用作为key,而真正的value才是存放的Object。

内存泄露:

如果一个ThreadLocal没有外部强引用来引用它,那么系统 GC 的时候,这个ThreadLocal势必会被回收。收回后ThreadLocal为null,这样一来,ThreadLocalMap中就会出现key为null的Entry,就没有办法访问这些key为null的Entry的value,如果当前线程再迟迟不结束的话,这些key为null的Entry的value就会一直存在一条强引用链:Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏。

其实,ThreadLocalMap的设计中已经考虑到这种情况,也加上了一些防护措施:在ThreadLocal调用get(),set(),remove()的时候都会清除线程ThreadLocalMap里所有key为null的value。使用完后手动调用ThreadLocalMap.remove方法清除线程内公共变量,防止内存泄露的发生。

由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。

猜你喜欢

转载自blog.csdn.net/MrLiar17/article/details/83144229