threadLocal作用

threadLocal

作用

  1. ThreadLocal可以让线程独占资源,存储于线程内部,避免线程堵塞造成CPU吞吐下降。
  2. 使用同一个threadLocal ,但每个线程的变量是独立都,对其他线程不可见,不需要每个线程都 new 一个对象,减少了内存的开销。

原理

ThreadLocal如何创建副本的?(如何维护变量的)

在每个Thread中包含一个ThreadLocalMap,ThreadLocalMap的key是ThreadLocal的对象,value是独享数据。

每个Thread 维护一个 ThreadLocalMap 映射表,这个映射表的 key 是 ThreadLocal实例本身,value 是真正需要存储的 Object。

也就是说 ThreadLocal 本身并不存储值,它只是作为一个 key 来让线程从 ThreadLocalMap 获取 value。

总结:

1、每个Thread维护着一个ThreadLocalMap的引用

2、ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储

3、调用ThreadLocal的set()方法时,实际上就是往ThreadLocalMap设置值,key是ThreadLocal对象,值是传递进来的对象

4、调用ThreadLocal的get()方法时,实际上就是往ThreadLocalMap获取值,key是ThreadLocal对象

5、ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value。

———————

内存泄漏

ThreadLocal内存泄漏的原因主要是因为ThreadLocal中包含了ThreadLocalMap,然而ThreadLocalMap的对象是在Thread中的,如果Thread没有结束,则ThreadLocalMap一直不会释放,假如ThreadLocalMap中设置了很多值,而且没有手动设置remove(),则可能会造成内存泄露

先思考一下,如果每次GC都把ThreadLocal给回收掉,那么业务代码在运行的时候出现GC,ThreadLocal被回收之后,业务代码就会获取不到值,这样就会出现问题。弱引用的定义确实是在GC的时候就会被回收掉,如果ThreadLocal又被其它强引用指向了,则它是不会被回收的,想想我们在使用ThreadLocal的时候,我们是怎么定义并使用他的呢?

可以看到threadLocal可以定义为一个全局的静态变量或者是一个局部变量,threadLocal是强引用,不管怎么样它都不会被回收掉,只是又将它的引用又给到了ThreadLocalMap中的Entry.key中,虽然这个key是弱引用,但是ThreadLocal对象是不会被回收的。

如果一个线程Thread结束了,那么Thread里面的threadLocals将会被回收掉,也就是ThreadLocalMap数据结构会被回收掉,也就不会出现内存泄漏的问题。那出现内存泄露的情况是什么呢?

当Thread一直没有结束时,Thread中的threadLocals就不会被回收,threadLocals里面存储的Entry如果不手动删除的话,就会一直存在这个threadLocals里面,所以就会出现内存泄漏的问题,通常在线程池的情况下,一个Thread会使用很长时间,如果在使用的过程中,一直向里面设置Entry,也就是key = ThreadLocal 和 value=业务对象,如果一个线程的任务执行完毕之后,没有手动设置remove()方法释放掉这个Entry的话,那么Thread的threadLocals中的Entry将会一直膨胀,一直停留在Thread中的threadLocals中,造成内存泄漏,所以一定要手动设置remove()。

如果是局部变量的话,只剩下弱引用,会被gc自动回收,只剩下value,而这个value的key此时会变成null,如果再有set get 的调用,会将key为null的value自动清除

——————————

当未设置值时 返回getValue的值是null

可以通过继承threadLocal

实现一个init相关的方法 可以设置这个默认返回值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值