当前位置: 首页 > news >正文

Java——》ThreadLocal

推荐链接:
    总结——》【Java】
    总结——》【Mysql】
    总结——》【Redis】
    总结——》【Kafka】
    总结——》【Spring】
    总结——》【SpringBoot】
    总结——》【MyBatis、MyBatis-Plus】
    总结——》【Linux】
    总结——》【MongoDB】
    总结——》【Elasticsearch】

Java——》ThreadLocal

  • 一、概念
  • 二、源码
  • 三、内部结构
  • 四、特点
  • 五、内存泄漏问题
    • 1、现象
    • 2、解决方案
  • 六、内存泄漏案例
  • 七、保证原子性

一、概念

ThreadLocal可以理解为线程本地变量,他会在每个线程都创建一个副本,那么在线程之间访问内部副本变量就行了,做到了线程之间互相隔离,相比于synchronized的做法是用空间来换时间。
ThreadLocal的本质就是一个Map,ThreadLocal做为key,将一个数据和本地线程绑定在一起。

二、源码

ThreadLocal有一个静态内部类ThreadLocalMap,ThreadLocalMap又包含了一个Entry数组,Entry本身是一个弱引用,他的key是指向ThreadLocal的弱引用,Entry具备了保存key value键值对的能力。
image.png
image.png

三、内部结构

image.png

四、特点

  • 每个Thread中都存储着一个成员变量ThreadLocalMap
  • ThreadLocal本身不存储数据,像是一个工具类,基于ThreadLocal去操作ThreadLocalMap
  • ThreadLocalMap本身就是基于Entry[]实现的,因为一个线程可以绑定多个ThreadLocal,这样一来,可能需要存储多个数据,所以采用Entry[]的形式实现。
  • 每一个现程都自己独立的ThreadLocalMap,再基于ThreadLocal对象本身作为key,对value进行存取
  • ThreadLocalMap的key是一个弱引用,弱引用的目的是为了防止内存泄露,如果是强引用那么ThreadLocal对象除非线程结束否则始终无法被回收,弱引用则会在下一次GC的时候被回收

五、内存泄漏问题

Java中4种引用:
强引用:OOM也不清除
软引用:内存不足清除
弱引用:只要GC就清除
虚引用:拿不到引用,构建出来就凉凉~~

image.png

1、现象

假如ThreadLocal对象被回收之后,key因为弱引用也会被GC回收掉,同时线程还没有被回收,entry中就存在key为null,但value有值的entry对象,但是内存中的value无法被获取到,同时也无法被回收,就会导致内存泄漏。

2、解决方案

使用TheadLocal完毕后,调用remove方法删除Entry对象
image.png

六、内存泄漏案例

参考链接:Java——》内存泄露案例

七、保证原子性

ThreadLocal保证原子性的方式,是不让多线程去操作临界资源让每个线程去操作属于自己的数据

static ThreadLocal tl1 = new ThreadLocal();
static ThreadLocal tl2 = new ThreadLocal();public static void main(String[] args) {tl1.set("123");tl2.set("456");Thread t1 = new Thread(() -> {System.out.println("t1:" + tl1.get());System.out.println("t1:" + tl2.get());});t1.start();System.out.println("main:" + tl1.get());System.out.println("main:" + tl2.get());
}
http://www.lryc.cn/news/164790.html

相关文章:

  • 如何做好利益相关方的期望管理?
  • 【K8S系列】深入解析k8s网络插件—Canal
  • 从单页面应用角度去解决不跳转页面,也能更改浏览器url地址
  • Linux:keepalived + ipvsadm
  • Linux基础命令(示例代码 + 解释)
  • 巨人互动|Google企业户Google“自动采纳建议”应该如何使用
  • 元宇宙全球市场规模到2030年将达9805亿美元!
  • 《向量数据库指南》——向量数据库内核面临的技术挑战及应对措施
  • API对接中需要注意的事项
  • linux 6中4T磁盘识别并分区格式化
  • WebServer 解析HTTP 响应报文
  • 开利网络参与“大湾区独角兽创投大赛”进行蚓链数字生态项目路演
  • 前端的8种跨域解决方案
  • Linux知识点 -- 网络编程套接字
  • 逆向大漠插件/用VB6.0实现后台鼠标移动和后台鼠标左键点击
  • 重庆OV证书和EV证书有什么区别
  • uni-app(微信小程序)图片旋转放缩,文字绘制、海报绘制
  • Spring Boot 2.x基础教程
  • 汽车红外夜视系统行业发展总体概况
  • Java 和 PHP GC 的差异和差异出现的原因
  • loguru logger使用
  • vue-自适应布局-postcss-pxtorem
  • 9.12|day 5|day 44 |完全背包| 518. 零钱兑换 II | 377. 组合总和 Ⅳ
  • C++ 中的原子变量(std::atomic)使用指南
  • 【用unity实现100个游戏之9】使用Unity制作类八方旅人、饥荒风格的俯视角2.5D游戏
  • 如何在群晖中,正确配置 docker 的 ipv6 地址
  • XSS入门 XSS Challenges
  • 李沐《动手学深度学习》torch.cat() 和 torch.stack()的区别及思考
  • 【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先
  • bboss 流批一体化框架 与 数据采集 ETL