首页 > 其他分享 >关于ThreadLocal使用完后要不要使用remove方法进行释放

关于ThreadLocal使用完后要不要使用remove方法进行释放

时间:2024-07-22 23:09:02浏览次数:6  
标签:释放 完后 remove ThreadLocal 线程 key 使用

ThreadLocal会为每个线程分配一个变量副本,在Thread类中通过ThreadLocalMap进行保存,key为ThreadLocal对象,value为设置的值,其中key为弱引用。

接下来要从以下2个方面进行讨论:

1、ThreadLocal是局部变量还是全局变量

2、程序中是否使用了线程池

首先来讨论2,如果程序未使用线程池,那么线程会在执行完后自动销毁,即内部的成员ThreadLocalMap也会被回收,此时无论1中ThreadLocal是局部变量还是全局变量都不会有影响。

如果2中使用了线程池:当1中ThreadLocal是局部变量时,那么在方法执行完之后,ThreadLocal对象将不会有强引用,在进行GC的时候,ThreadLocalMap的key指向的ThreadLocal将被回收,但是value得不到释放,所以这种情况需要执行ThreadLocal.remove()手动释放。

当1中ThreadLocal是全局变量时(被static修饰),那么ThreadLocal的生命周期可以看做和程序的生命周期一致,即只要程序不崩溃或者停止,ThreadLocal将一直持有强引用(一般在项目里ThreadLocal使用的是这种方式),那么在进行GC的时候,ThreadLocalMap的key永远无法回收,这种情况也需要执行ThreadLocal.remove()手动释放。

综上所述,情况可以分为三类:

1、上述2中未使用线程池

2、上述2中使用线程池,1中ThreadLocal是局部变量

3、上述2中使用线程池,1中ThreadLocal是全局变量

对于情况1来说,使用完ThreadLocal后,可以不使用ThreadLocal.remove()手动释放。

对于情况2、3来说,使用完ThreadLocal后,必须使用ThreadLocal.remove()进行手动释放。

但你无法确定以后项目里会不会使用线程池?如果以后使用了,而未执行ThreadLocal.remove(),那将是一个隐患,所以建议情况1也调用remove手动释放。

结论:如果你能保证项目一定不会用到线程池,可以不用ThreadLocal.remove()手动释放,否则必须要手动释放。

 

关于ThreadLocalMap的key为何要设置为弱引用,从上述的情况2也能看出,当线程要运行很长时间时(线程池),通过GC可以释放key所占用的内存。

标签:释放,完后,remove,ThreadLocal,线程,key,使用
From: https://www.cnblogs.com/kjxcom/p/18317185

相关文章

  • 科普文:TransmittableThreadLocal通过javaAgent实现线程传递并支持ForkJoin
    概叙TransmittableThreadLocal的介绍,直接看官网:https://github.com/alibaba/transmittable-thread-local目前使用中的稳定发布版本v2.x在 分支2.x上。帮助文档:https://github.com/alibaba/transmittable-thread-local#-%E5%8A%9F%E8%83%BD这篇文章主要介绍了Transmitta......
  • ThreadLocal 维护数据库连接、事务管理
    即便添加业务,也不能维护原子性,因为每个Dao都有自己的connection因此,我们需要使用ThreadLocal维护一个唯一的Connectionpackagecom.powernode.bank.mvc;importcom.powernode.bank.exceptions.AppException;importcom.powernode.bank.exceptions.MoneyNotEnoughException;......
  • 从ThreadLocal底层源码一直聊到内存泄漏,干货满满!!
    小强最近在疯狂补习高并发的相关知识,但是在学到threadLocal时有点力不从心了,尤其是threadLocal的底层架构和如何导致内存泄漏,今天我们帮小强一把!!把这一块彻底聊清楚!!!文章目录1.threadLocal的前世今生1.为什么要使用threadLocal2.threadLocal和Synchonized的比较3.使用场......
  • Java笔记之ThreadLocal
    定义:ThreadLocal叫做线程变量,该变量对其他线程而言是隔离的,是当前线程独有的变量。ThreadLocal为变量在每一个线程中都创建了一个副本,并且该副本只能当前Thread使用,因此不存在多线程共享的问题。原理:Thread类有一个类型ThreadLocalMap的实例变量ThreadLocals,每个线程都有一个......
  • HitPaw Watermark Remover for mac(专业去水印工具)v2.4.4版
    HitPawWatermarkRemover是一款实用的水印处理工具,能够帮助用户轻松处理图片、视频中的水印,使用HitPawWatermarkRemover删除故事中的日期,建筑物,人物和许多其他事物,让画面更加整洁,满足您的各种需求HitPawWatermarkRemoverformac(专业去水印工具)软件地址HitPawWa......
  • Android Viewpager2 remove fragmen不生效解决方案
    一、介绍在如今的开发过程只,内容变化已多单一的fragment,变成连续的,特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动,到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓存,导致想立马生效出现问题,不符合国内的业务场景。......
  • threadLocal详细认识(使用场景与局限性)与样例测试
    Threadlocal的介绍与使用1,是什么?ThreadLocal是Java提供的一个工具类,用于在多线程环境中为每个线程提供独立的变量副本。它是Java标准库中的一部分,提供了线程局部存储的功能,这意味着每个线程都有自己独立的变量副本,这些副本在其他线程中不可见。2,有啥特点?线程隔离:Th......
  • laravel: 安装完后配置session使用文件而非使用数据库
    一,报错信息:laravel在安装完成后初次运行时会报错,InternalServerErrorIlluminate\Database\QueryExceptionSQLSTATE[HY000]:Generalerror:8attempttowriteareadonlydatabase(Connection:sqlite,SQL:update"sessions"set"payload"=YTozOntzOjY......
  • [AGC035D] Add and Remove
    [AGC035D]AddandRemove非常妙的一道题,考虑最后剩下一定是\(a[1]\)和\(a[n]\),我们就想一想可不可以算每个数会对答案产生多少贡献?我们如果考虑加数似乎更方便?考虑刚开始在\(a[1]\)和\(a[n]\)之间加入一个数\(x\),会产生\(2x\)的贡献,如果再在\(x\)和\(a[n]\)......
  • Java 并发 - ThreadLocal详解
    ThreadLocal是通过线程隔离的方式防止任务在共享资源上产生冲突,线程本地存储是一种自动化机制,可以为使用相同变量的每个不同线程都创建不同的存储。@立刀旁目录#带着BAT大厂的面试问题去理解#ThreadLocal简介#ThreadLocal理解#ThreadLocal原理#如何实现线程隔......