15、谈谈你对ThreadLocal的理解?ThreadLocal的底层原理?ThreadLocal的内存泄露问题?

①ThreadLocal主要有两个功能,第一个是实现了对资源对象的线程隔离,确保每个线程只能操作自己的资源对象,避免了竞争引发的线程安全问题。第二个是实现了线程内的资源共享。

②当线程首次调用ThreadLocal的set()方法时,ThreadLocal会为这个线程分配一个ThreadLocal的本地副本,它内部维护了一个ThreadLocalMap类型的成员变量,也就是说每个线程都拥有一个ThreadLocalMap,用来存储线程的私有资源。当我们调用set()方法时,会把ThreadLocal自己作为key,资源对象作为value,存储到当前线程的ThreadLocalMap中。当调用get()方法时,把ThreadLocal自己作为key,到当前线程的ThreadLocalMap中查找关联的资源值。当调用remove()方法时,也是把ThreadLocal自己作为key,到当前线程的ThreadLocalMap中移出关联的资源值。

③不恰当的使用ThreadLocal可能会导致内存泄漏,我之前看过源码,这是因为ThreadLocalMap的key是被设计为弱引用,它是被动的依靠GC回收,但关键的是只有key会被回收,而value不会,因为value是一个强引用。如果一直不回收value,日积月累就会导致内存泄漏。

解决办法就是在使用ThreadLocal时把它作为静态变量,也就是强引用,不让它被动的依靠GC回收,而是我们在使用完后主动的调用remove()方法去回收它,这样就能避免内存泄漏。

dd388ccd5c6341e28ca1a34763032f4e.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值