特点:

  • 依托于线程的生命周期而存在,贯穿于整个线程,解决了线程前后值传递的问题。

  • 一次存入,只要线程不结束都可以获取到

  • 不具有多线程之间共用数值的特性,只存在于单个线程内,主子线程之间不会出现值传递。

    (除非进行特殊的代码操作),但是多线程对象却共同存在于

    ThreadLocalMap的Entry中,这也是多线程处理并发的一种能力

  • ThreadLocal被ThreadLocalMap中的entry的key弱引用,如果出现GC的情况时,没有被其他对象引用,会被回收,但是ThreadLocal对应的value却不会回收,容易造成内存泄漏,这也间接导致了内存溢出以及数据假丢失

在前面的总结中我为啥说数据会假丢失呢,大家可以看如下代码:

Entry中的key在GC的时候会被回收,但是对应的Value却还存在,这样就会造成key(null)的情况,对应的value也会取不到,这就是内存泄漏的原因。

同时也会造成数据丢失。。如下图中的代码:

执行如图代码:

结果为:

留坑必须要填:既然发现问题,就要解决问题

如果我们要使用ThreadLocal的作为线程前后的数据传输,又不想在遇到GC的时候数据被丢失,可以如下操作:

利用饿汉单例模式占用对象,不让GC对ThreadLocal进行垃圾回收。测试一下:

结果为:

最后,贴一张网络上对ThreadLocal做的拓扑图:


虚线代表这弱引用,当前线程保存了ThreadLocalMap作为自己的local属性,而Map中的key又弱引用了ThreadLocal,从而达到了ThreadLocal不存数据,而数据存在Thread中,而根据ThreadLocal获取Thread中的值。

ThreadLocal中经典的面试题(根据本文应该有一个比较深的理解了):

  • ThreadLocal有什么缺陷?

    如果是线程池里的线程用ThreadLocal会有什么问题?

-END-

Java一日一条

ID:mjx_java

在看 

怎么解决 数据丢失的问题_ThreadLocal中内存泄漏和数据丢失问题的问题浅析及解决方案...相关推荐

  1. antimalware service executable占用内存_解决 vue 项目运行过程中内存泄漏问题

    vue-cli3.0 内存溢出 JavaScript heap out of memory vue-cli3.0构建的项目,开发过程中,可能会遇到内存溢出的情况,改动一点代码,代码编译,进程就会断掉, ...

  2. Android 中内存泄漏的原因和解决方案

    之前研究过一段时间关于 Android 内存泄漏的知识,大致了解了导致内存泄漏的一些原因,但是没有深入去探究,很多细节也理解的不够透彻,基本上处于一种似懂非懂的状态,最近又研究了一波,发现有很多新的收 ...

  3. VC++6.0中内存泄漏检测 转

    最近看了周星星 Blog 中的一篇文章:"VC++6.0中内存泄漏检测",受益匪浅,便运行其例子代码想看看 Output 窗口中的输出结果,可惜怎么弄其输出都不是预期的东西,郁闷了 ...

  4. C++中内存泄漏的检测方法介绍

    本文介绍C++中内存泄漏的检测方法. 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsChe ...

  5. 解决出现线程未关闭 , 造成内存泄漏问题

    解决出现线程未关闭 , 造成内存泄漏问题 16-Feb-2022 16:38:24.978 警告 [main] org.apache.catalina.loader.WebappClassLoader ...

  6. C++ 内存管理中内存泄漏问题产生原因以及解决方法

    C++内存管理中内存泄露(memory leak)一般指的是程序在申请内存后,无法释放已经申请的内存空间,内存泄露的积累往往会导致内存溢出. 一.内存分配方式 通常内存分配方式有以下三种: (1)从静 ...

  7. 如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

    原文来自互联网,由长沙DotNET技术社区编译. 本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-ne ...

  8. wpf绑定treeview 带查找_如何查找,修复和避免C#.NET中内存泄漏的8个最佳实践

    本文来源:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/ 从事大型企 ...

  9. 内存泄漏的原因及解决办法_浅谈 JS 内存泄漏问题

    什么是内存泄漏? 程序的运行需要内存.只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存. 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高 ...

最新文章

  1. Luogu P1073 最优贸易【最短路/建反图】 By cellur925
  2. base64 二进制流java_读取和base64编码二进制文件
  3. note_pom.xml文件配置说明_note
  4. linux基础-01-用户和目录、vim、归档和解压、系统启动流程、加密
  5. javascript中的正则表达式学习
  6. python与办公自动化-python办公自动化:自动进行word文档处理和排版
  7. 知识库文章MDL9396274-How to:使用色环电阻计算器
  8. 用计算机算账老是出负数是怎么回事,结存数量为负数是什么意思
  9. windows配置指定网段流量走虚拟专用网络
  10. Outlook设置自动存档
  11. 计算机电子预览室配置清单,完整的停车场管理系统设计方案-附停车场管理详细大样图及安装图!...
  12. Java菜鸟如何入门?1分钟入门
  13. Coding and Paper Letter(三十)
  14. fm24c16c语言程序,单片机读写24C01~24C16程序
  15. 迅软科技协助化妆行业从根本上解决敏感数据泄露问题!
  16. react之router
  17. 课后作业——Day11
  18. 2022年河南省高职单招(职业倾向性)(思想道德素质与法律)考试冲刺试题及答案
  19. java人名识别_HanLP中人名识别分析
  20. c#调用TeamViewer或AnyDesk实现远程控制

热门文章

  1. java反射可以获得什么属性_java反射获得属性的值
  2. criscriter英语测试软件,iTEST大学英语测试与训练系统
  3. html2canvas 截图div_H5快照截图[html2canvas]+图片下载
  4. php和mysql两种不同方式的分割字符串和类型转换
  5. laravel静态资源
  6. 使用完成端口监控文件目录的例子
  7. JavaScript substr() 方法
  8. Android中数据库的一些操作(增删改查)
  9. C++中的各种预处理的表示
  10. 多线程—并发容器与机制