ThreadLocal源码分析

作用:

ThreadLocal就是为每一个使用该变量的线程都提供一个变量的副本,然后每一个线程都可以独立更改自己的副本,而不会与其他线程的副本冲突,从而实现线程间的数据隔离。

源码:

Set方法:

getMap:返回与当前线程ThreadLocal相关联的Map

 

从源码上看,也就是说每一个线程都维持着一个ThreadLocalMap对象(也就是一个threadLocals的参数),里面存放着键值对,其中键为ThreadLocal对象,值为我们所设置的值。然后当调用set/get方法的时候,都是先通过当前线程获取ThreadLocalMap对象,然后以ThreadLocal为Key设置或获取其值。

注意事项:

  1. ThreadLocalMap中的Entry对象的Key是对ThreadLocal的弱引用,这主要是为了防止内存溢出问题,如:

其中,tl对ThreadLocal是强引用,而ThreadLocalMap中的key对ThreadLocal是弱引用,这样的话,当tl=null,ThreadLocal对象就会被回收。否则,即使tl=null,当ThreadLocalMap仍然有ThreadLocal的强引用,因此就不会被回收。

即使这样,仍然存在内存泄漏问题。由于ThreadLocal被回收,key的值变为null,但value仍然存在,会导致value再也无法被访问到。因此仍然具有内存泄露问题。所以在使用完ThreadLocal之后及时调用remove方法才是解决内存泄露问题的关键。

 

欢迎指正!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值