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

Threadlocal的实现原理

文章目录

  • ThreadLocal与Thread关系分析
  • Threadlocal 不支持继承性
  • lnheritableThreadLocal 类

ThreadLocal与Thread关系分析

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
由该图可知, Thread 类中有一个 threadLocals 和一个 inheritableThreadLocals , 它们 都是 ThreadLocalMap 类型 的变量 , 而 ThreadLocalMap 是一个定制化的 Hashmap 。 在默认情况下, 每个线程中的这两个变量都为 null,只有当前线程第一次调用 ThreadLocal 的 set 或者 get 方法时才会创建它们 。 其实每个线程的本地变量不是存放在 ThreadLocal 实例 里面,而是存放在调用线程的 threadLocals 变量里面 。 也就是说 , ThreadLocal 类型的本地变量存放在具体的线程内存空间中ThreadLocal 就是一个工具壳,它通过 set 方法把 value 值放入调用线程的 threadLocals 里面并存放起来 , 当调用 线程调用它的 get 方法时,再从当 前线程的 threadLocals 变量里面将其拿出来使用 。 如果调用线程一直不终止, 那么这个本地变量会一直存放在调用线程的 threadLocals 变量里面 ,所以当不需要使用本地变量时可以通过调用 ThreadLocal 变量的 remove 方法 ,从当前线程的 threadLocals 里面删除该本地变量 。另外, Thread 里面 的 threadLocals 为何被设计为 map 结构?很明显是因为每个线程可以关联多个 ThreadLocal 变量。

Threadlocal 不支持继承性

同一个 ThreadLocal 变量在父线程中被设置值后 , 在子线程中 是获取不到的。这应该是正常现象,因为在子线程 thread 里面调用 get 方法时当前线程为 thread 线程,而这里调用 set 方法设置线程变量的是 main 线程,两者是不同的线程,自然子线程访 问时返回 null。那么有没有办法让子线程能访问到父线程中的值? 答案是有 。

lnheritableThreadLocal 类

为了解决ThreadLocal不支持继承的问题, lnheritableThreadLocal 应运 而 生。 InheritableThreadLocal继承自 ThreadLocal , 其提供了一个特性,就是让子线程可 以访问在父线程中设置的本地变量 。在 InheritableThreadLocal 的世 界里 , 变量 inheritableThreadLocals 替 代 了 threadLocals 。我们需要在父线程时将需要存储的数据使用lnheritableThreadLocal 放入Thread的inheritableThreadLocals中,然后在new子线程时,Thread的构造函数内就会判断父线程inheritableThreadLocals中是否存在数据,存在的话就会将数据放入子线程的inheritableThreadLocals中。这样就实现了父子线程的数据传递。在子线程的时候就可以使用InheritableThreadLocal获取来自父线程传递来的数据。

http://www.lryc.cn/news/536637.html

相关文章:

  • 线程池处理异常
  • RabbitMQ配置SSL证书
  • .NET 9.0 的 Blazor Web App 项目,进度条 <progress> 组件使用注意事项
  • 第J7周:对于ResNeXt-50算法的思考
  • 【第2章:神经网络基础与实现——2.3 多层感知机(MLP)的构建与调优技巧】
  • 【Elasticsearch】keyword分析器
  • 重生之我在异世界学编程之C语言:深入预处理篇(上)目录)
  • MySQL数据库误删恢复_mysql 数据 误删
  • SpringAI集成DeepSeek实战
  • 解决 THC/THC.h: No such file or directory 报错
  • S4D480 S4HANA 基于PDF的表单打印
  • 数组_移除元素
  • Vue2/Vue3分别如何使用Watch
  • C++从入门到实战(四)C++引用与inline,nullptr
  • Linux库制作与原理:【静态库】【动态库】【目标文件】【ELF文件】【ELF从形成到假造轮廓】【理解链接和加载】
  • 项目BUG
  • wordpress部署nginx版的
  • 【鸿蒙Next】优秀鸿蒙博客集锦
  • 【第2章:神经网络基础与实现——2.1 前馈神经网络的结构与工作原理】
  • python-leetcode-阶乘后的零
  • Python:学生管理系统(继承性、多态性)。
  • 网络安全RSA加密
  • Vue学习笔记4
  • mariadb数据库的安装与部署
  • 单调队列与栈
  • Matlab 多项式曲线拟合(三维)
  • 机器翻译同样的文本,是从英语翻译成日语更准确还是中文翻译成日语更准确
  • MAC 系统关屏幕后电量消耗极快 Wake Requests
  • golangAPI调用deepseek
  • 提供可传递的易受攻击的依赖项