ThreadLocal原理

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
key是弱引用
value强引用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
static表示对ThreadLocal强引用,建议手动调用remove()方法

ThreadLocal的原理:
每一个线程Thread里面都有一个ThreadLocalMap,它可以看做是一个HashMap,它的Entry的key是ThreadLocal,value是设置的值。当一个线程执行到ThreadLocal.set(value)的时候,就会先拿到当前线程,然后去拿到线程的ThreadLocalMap,然后将ThreadLocalMap指向ThreadLocal, value设置好值,这样就达到了线程隔离,每个线程都有自己本地的一个变量副本。
在这里插入图片描述
Entry的弱引用?会有什么问题?
当ThreadLocal是弱引用,在没有外部引用的情况下,如果发生垃圾回收就会被清理掉,这个时候就会导致key为null,value不为null的情况,如果每次用完之后不清理掉,可能value就永远无法清除,所以一般用完之后调用remove将entry清理掉。
主要两个原因:
1 . 没有手动删除这个 Entry
2 . 当前线程依然运行
第一点很好理解,只要在使用完下 ThreadLocal ,调用其 remove 方法删除对应的 Entry ,就能避免内存泄漏。
第二点稍微复杂一点,由于ThreadLocalMap 是 Thread 的一个属性,被当前线程所引用,所以ThreadLocalMap的生命周期跟 Thread 一样长。如果threadlocal变量被回收,那么当前线程的threadlocal 变量副本指向的就是key=null, 也即entry(null,value),那这个entry对应的value永远无法访问到。
而实际私用ThreadLocal场景都是采用线程池,而线程池中的线程都是复用的,这样就可能导致非常多的entry(null,value)出现,从而导致内存泄露。
综上, ThreadLocal 内存泄漏的根源是:
由于ThreadLocalMap 的生命周期跟 Thread 一样长,对于重复利用的线程来说,如果没有手动删除(remove()方法)对应 key 就会导致entry(null,value)的对象越来越多,从而导致内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值