首页 > 其他分享 >ThreadLocal怎么说

ThreadLocal怎么说

时间:2022-11-29 00:45:08浏览次数:40  
标签:怎么 ThreadLocalMap ThreadLocal 线程 内存 key null

目录

ThreadLocal怎么说

这么说

  1. ThreadLocal可以实现资源的线程隔离,避免线程安全问题
  2. ThreadLocal实现了线程内的资源共享
  3. 其原理是,每个线程内有一个ThreadLocalMap类型的成员变量,用来存储资源
    1)调用set方法就是以ThreadLocal自己作为key,资源作为value,放入当前线程的ThreadLocalMap集合中
    2)调用get方法就是以ThreadLocal自己作为key,到当前线程中查找关联的资源
    3)调用remove方法就是以ThreadLocal自己作为key,移除当前线程关联的资源
  4. 为什么ThreadLocalMap中的key(即ThreadLocal)要设计为弱引用?
    1)线程可能会长时间运行(如线程池中的线程),如果key不再使用,需要在内存不足(GC)时释放其占用的内存
    2)但是GC只是释放key的内存,后续还得根据key是否为null来进一步释放值的内存,时机有:
      a)get key时,发现为null
      b)set key时,会使用启发式扫描,清除临近的为null的key,
      启发次数与元素个数、是否发现为null的key有关
      c)remove时(推荐),因为一般使用ThreadLocal时都把它作为
      静态变量,因此GC无法回收,推荐remove掉
    
  5. 内存泄漏
    https://zhuanlan.zhihu.com/p/58636499
    https://www.cnblogs.com/arielmeng/p/15617405.html
    https://juejin.cn/post/6844903985745231885
    上文总结一下:
    弱引用:
    ThreadLocal自身并不储存值,而是作为一个key来让线程从ThreadLocalMap获取value。Entry是中的key是弱引用,所以jvm在垃圾回收时如果外部没有强引用来引用它,ThreadLocal必然会被回收。但是,作为ThreadLocalMap的key,ThreadLocal被回收后,ThreadLocalMap就会存在null,但value不为null的Entry。若当前线程一直不结束,可能是作为线程池中的一员,线程结束后不被销毁,又不再调用对应的get/set方法,那这个value就会一直存在,无法回收,就引发内存泄漏。
    强引用:略

标签:怎么,ThreadLocalMap,ThreadLocal,线程,内存,key,null
From: https://www.cnblogs.com/xxg98/p/16934258.html

相关文章

  • vba ad域服务器信息怎么获取,获取AD域用户登入信息
    PrivateSubCommandButton1_Click()OnErrorResumeNextConstADS_SCOPE_SUBTREE=2SetobjConnection=CreateObject('ADODB.Connection')......
  • 【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获
    问题描述AppService中,如何通过ApplicationSetting来配置KeyVault中的值呢? 问题解答首先,AppService服务可以直接通过引用的方式,无需代码的情况下,为Application......
  • ubuntu密码忘记了怎么办
     1、重启Ubuntu,长按shift出现如下界面,选中recoverymode的选项,按‘e’进入界面,务必记得不要按enter键   2、找到下图中“rorecoverynomodeset'删除,并且加上'qui......
  • https是怎么防止中间人攻击的
    什么是中间人攻击一般,一个http请求,是从客户端请求出去,再到达服务端。但请求不是直接到达服务端的,因为网络上要经过很多"节点",最后才会到达服务端。 举个例子比如,平时......
  • 详述怎么使用Linux救援模式
    当你的Linux系统出现问题时你会怎么办,直接重新安装,还是用Linux救援模式。或许你对这个模式很陌生但是并不妨碍他会对你有很大的帮助,可以帮你挽回很多重要的数据,是你不必很伤......
  • ❤️【Android精进之路-05】怎么创建Activity,如何启动另一个Activity,干货满满,建议收藏❤
    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。本文亮点:详细介绍Activity的创建以及如何传递参数和接收返回参数Android系列文章都在Android专栏中,欢迎小伙伴关注。文章......
  • 电脑怎么查看端口是否开放
    https://product.pconline.com.cn/itbk/software/dnyw/1436/14362232.html在我们使用某个软件时,可能会发现某个软件的端口被抢占,导致软件无法正常启动,那么这时我们该怎么......
  • ubuntu密码忘记了怎么办
    1、重启Ubuntu,长按shift出现以下界面,选择第二个高级选项,按回车键  2、紧接着进入如下界面,选中recoverymode的选项,按‘e’进入界面,务必记得不要按enter键  3、找......
  • 怎么开一个传奇需要准备什么 开传奇服务器具体需要多少本钱
    带着这个疑问,今日来给大家讲解一下,分为两种情况来讲解如果自己会技术的话是可以节约很多成本的,自己会技术的情况下只需要准备一台服务器,一个版本(又名服务端)域名虚拟主机(用......
  • 电脑怎么取消重启关机键
    首先,按下Win+R组合键开启的“运行”对话框,输入GPEDIT.MSC命令并回车,打开组策略编辑器。 然后在组策略编辑器中定位“计算机配置”路径下的“管理模板”中的“开......