Theadlocal和它造成的内存泄露

Theadlocal和它造成的内存泄露

ThreadLocal、Thead、TheadMap。

Thead类里有一个成员变量是TheadMap类型,这个TheadMap类的每一个entry的key是Theadlocal类,value就是Theadlocal类中存储的对象。对Theadlocal进行get和set时都是通过当前线程获取TheadMap对象,然后以当前Theadlocal对象为key,要存的值为value存入其中。(一个线程可以创建很多个Theadlocal对象,相当于这个TheadMap对象中可以有很多对值)

ThreadLocal中存入的内容是线程私有的,是线程安全的。(如果存入对象的话一定要存入对象的副本,否则也是线程不安全的)。

保证new出来的Theadlocal不同:

主要是通过Theadlocal内封装的一个final int字段threadLocalHashCode,当每次new一个Theadlocal时,都会以相同的增加量原子更新一个AtomicInteger字段,然后把这个字段赋值给threadLocalHashCode,这个AtomicInteger字段是static的,也就是说下一次new Theadlocal时就还会在此基础上赋值给threadLocalHashCode一个新值。

内存泄露问题:TheadMap使用ThreadLocal的弱引用为key,当外界没有对TheadLocal的强引用时,内存就会回收TheadLocal。此时TheadMap的key就是null,但是TheadMap不会被回收,因为有当前线程对象Thread强关联。这样如果线程不结束就有可能造成内存溢出。ThreadLocal类自身可以在getset时遇见为null的key会清除掉,但是这样还不能避免内存溢出,需要调用者手动调用remove方法,手动删除不需要的ThreadLocal。建议把ThreadLocal设置为静态类变量,这样它的生命周期就会很长不会出现被回收的现象,用完再remove掉。

转载于:https://www.cnblogs.com/shizhuoping/p/11556770.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocal是Java中的一个类,用于实现线程局部变量。它可以在每个线程中创建一个变量的副本,每个线程对该副本进行操作,互不影响。 当线程第一次调用ThreadLocal的set或者get方法时,会创建一个threadLocals变量,用于存储该线程的本地变量。具体而言,ThreadLocal实例本身相当于一个装载本地变量的工具壳,通过set方法将值添加到调用线程的threadLocals中,当调用线程调用get方法时,能够从自己的threadLocals中取出该变量。 在get方法的实现中,首先获取当前调用线程,如果当前线程的threadLocals不为null,就直接返回当前线程的threadLocals变量中的本地变量值,否则执行setInitialValue方法来初始化threadLocals变量。 需要注意的是,如果调用线程一直不终止,那么该本地变量将一直存放在threadLocals中,可能会导致内存溢出。因此,在使用完ThreadLocal后,需要调用remove方法将该线程的threadLocals中的本地变量删除。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ThreadLocal详解](https://blog.csdn.net/m0_49508485/article/details/123234587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值