ThreadLocal (中) --- ThreadLocal底层原理、内存泄漏分析

ThreadLocal以及内存泄漏
ThreadLocal终极源码剖析-一篇足矣!
ThreadLocal在Spring事务管理中的应用

ThreadLocal你了解吗?

ThreadLocal应用场景在什么地方?

ThreadLocal会产生内存泄漏你了解吗?


同一线程中每一层方法必须是同一个connection才能支持事务
在这里插入图片描述
在这里插入图片描述
一个线程往ThreadLocal里面set对象以后,另一个线程get不到这个对象—线程隔离
在这里插入图片描述
ThreadLocal的set方法,ThreadLocalMap中的keythreadLocal的对象本身,value是传进来的参数value:
在这里插入图片描述
在这里插入图片描述
tl.set(new Person()):拿到当前线程,tl作为key,new Person()作为value,放进当前线程特有的map中

具体怎么set的呢:就是new了一个Entry来存
在这里插入图片描述在这里插入图片描述在这里插入图片描述
Entry是WeakReference的子类,构建时调用父类的构造方法;父类构造方法就是new出一个弱引用WR,接着再把k传给它,k就是tl对象;弱引用WR指向tl

在这里插入图片描述
如上图,key指向threadLocal是一个弱引用,这样当tl指向threadLocal的引用被取消时,即tl=null时,只剩下一个key指向threadLocal的弱引用,这样ThreadLocal可以被垃圾回收器回收,key指向的这块threadLocal不会造成内存泄漏

但是
在这里插入图片描述
如上图,当key变成null时,value指向的那一块区域无法被回收,导致内存泄漏

所以,当你不用key,value对的时候,要把它remove掉,防止内存泄漏


threadlocal的get和set方法会先把key为null的清除掉,但是仍然要手动remove掉------因为很多线程经常长时间不执行get和set方法


在这里插入图片描述
如果是线程池的话,线程用完又放回去,threadlocal忘记remove;下次这个线程又被拿出去,又没有清理,又放回去,那么threadlocal对象会越积越多,内存泄漏会越来越严重

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值