ThreadLocal关键字的理解

ThreadLocal的理解

  • ThreadLocal是每个线程自己的变量;每个线程保存一个ThreadLocalMap的变量,来保存ThreadLocal类型数据(可能一个线程有多个ThreadLocal数据)。
  • 线程是CPU资源调度的最小单位,我们的程序在操作系统中基本是以线程的形式在运行。
  • 这样就有一个好处,无论在哪个类中,都可以获取当前线程的全局变量,不需要拘泥于方法之间的相互传参问题。
  • 比如说一个Requst请求过来了,其实Tomcat为每个请求都创建了一个Servlet线程。我们可以把全局需要用到的Session、Region等等存放在,这个线程的ThreadLocalMap变量中,然后无论在哪里都可以随便使用。

用ThreadLocal实现动态路由

Java中的引用类型

  • 强引用:强引用关联的对象,永远不会被GC回收
  • 软引用:SoftReference,指的是那些有用但是不是必须要的对象。系统在发生内存溢出前会对这类引用的对象进行回收。
  • 弱引用:WeakReference,弱引用的对象下一次GC的时候一定会被回收
  • 虚引用:当发生GC的时候,虚引用也会被回收

ThreadLocal内存泄漏问题

ThreadLocalMap包含Entry数组,Entry是弱引用。弱引用在触发GC的时候,会被回收。key是ThreadLocal类型,value是obj对象。Entry会被回收,但是线程中value对应的对象不会被回收,除非线程结束。
解决方法:在使用完后,调用remove方法删除Entry对象。
参考:ThreadLocal原理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值