ThreadLocal的理解

ThreadLocal用于多线程下,按照线程为每个线程开辟一个储存空间,储存一个为Object类型的值,这个值是线程隔离,达到存入和取出的值,是和该线程绑定的。

ThreadLocal为什么可以设置为static?

为了多线程并发时节约空间,如果是设置为static,那么在并发时ThreadLocal对象在虚拟机加载时已经完成加载,并且多个线程自己的ThreadLocalMap都使用同一个ThreadLocal对象作为自己的Key,所以如果项目Spring项目,并且已经设置该类为singleton(单例),就不用设置为static

鸡肋的弱引用

ThreadLocal的entity的KEY对ThreadLocal的引用,之所以使用弱引用,是因为我们在使用中,如果在ThreadLocal tl = new ThreadLocal()的tl指向其他变量后,不需要手动释放掉堆里面原先的tl指向的ThreadLocal对象,因为ThreadLocalMap的eneity的key对堆里面的ThreadLocal是弱引用,发生gc的时候,自动释放掉原先tl指向的ThreadLocal对象,但是在实际生产中,我们一般对于tl对象使用都是当作全局变量,而且不会改变其引用对象,所以在实际生产中,弱引用对项目空间优化意义不大。

是否需要remove?

之所以需要remove,是为了防止内存泄露,但是在使用过程中,很多时候ThreadLocal的value对象在的remove的时候,都是在代码的finally的时候处理,也就是项目的最后去remove,然后线程结束,如果是这个逻辑,个人觉得对于并发量不是很大的项目,不用remove也可以,因为线程结束时这个ThreadLocalMap也没有,相当于一个是先remove后线程结束,则清空ThreadLocalMap,而不remove是线程结束直接清空ThreadLocalMap,但是作为使用ThreadLocal的标准,remove应该作为一个好习惯去处理

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值