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

java ThreadLocal源码分析

写个demo测试下:

private static void testThreadLocal() {ThreadLocal<Integer> threadLocal = new ThreadLocal<>();new Thread(){@Overridepublic void run() {threadLocal.set(9527);System.out.println("curr thread: " + Thread.currentThread().getName() + ", set 9527");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("curr thread: " + Thread.currentThread().getName() + ", getValue: " + threadLocal.get());}}.start();new Thread(){@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}threadLocal.set(250);System.out.println("curr thread: " + Thread.currentThread().getName() + ", set 250");System.out.println("curr thread: " + Thread.currentThread().getName() + ", getValue: " + threadLocal.get());}}.start();}

打印:

可以看出,同一个ThreadLocal对象,在不同的线程中设置值和取值互不干扰。

研究下源码。

Thread线程对象里面维护了一个ThreadLocalMap对象,上面示例中设置的值都是存在对应线程的ThreadLocalMap对象中,ThreadLocalMap用于存储其对应线程的数据:

看下如何创建ThreadLocalMap:

可以看出,ThreadLocalMap中有个table数组,用于存储Entry(键:ThreadLocal对象,值为需要保存的对象)。 table数组初始长度只有16, 根据threadLocalHashCode & 15得到索引,该索引范围0 - 15。 

后续table数组容量不够了会扩容该数组:

再看下Entry类:

继承了弱引用,当ThreadLocal对象没有强引用时可以被GC回收。

ThreadLocal核心方法:

1、set, 将需要保存的值保存到当前线程的ThreadLocalMap对象中。上面分析过,是通过键值对的方式保存,key为该ThreadLocal对象,value为要保存的对象。

2、get, 从当前线程的ThreadLocalMap中取出该ThreadLocal存的对象。

3、remove, 当存储数据不再使用时,记得调用remove方法移除数据,防止内存泄漏:

ok. 总结,通过ThreadLocal存储数据是存到调用线程中,不同线程存储的数据是互相独立的。可用于实现线程局部变量。

http://www.dtcms.com/a/267852.html

相关文章:

  • 深度学习6(多分类+交叉熵损失原理+手写数字识别案例TensorFlow)
  • 高效处理大体积Excel文件的Java技术方案解析
  • 安卓之service
  • QT 菜单栏设计使用方法
  • 基于AndServer的RPC架构:Android原生SO文件远程调用实战指南
  • Python 机器学习核心入门与实战进阶 Day 4 - 支持向量机(SVM)原理与分类实战
  • 深度学习图像分类数据集—蘑菇识别分类
  • plantuml用法总结
  • Java设计模式之行为型模式(策略模式)介绍与说明
  • 利用低空无人机影像进行树种实例分割
  • 深入解析Vue中v-model的双向绑定实现原理
  • 牛客周赛99
  • 关于 栈帧变化完整流程图(函数嵌套)
  • 大模型面试:RAG与Agent相关
  • 《Redis》集群
  • 【Note】《Kafka: The Definitive Guide》 第二章 Installing Kafka:Kafka 安装与运行
  • Redis--主从复制详解
  • 【Docker基础】Docker容器挂载方式深度解析:--volume与--mount参数对比
  • QT6 源(155)模型视图架构里的列表视图 QListView:接着学习成员函数,信号函数,附上本类的源代码带注释。
  • HCIA-网络地址转换(NAT)
  • CppCon 2018 学习:Woes of Scope Guards and Unique_Resource
  • 抖音小游戏(IAA)巨量引擎投放指南
  • [shadPS4] 内存管理 | 权限管理 |文件系统 | 挂载和句柄
  • 【BTC】数据结构
  • 7,TCP服务器
  • JavaScript基础语法之运算符和控制流
  • 李宏毅NLP-8-语音模型
  • 【管理学】组织纪律性与创新性的失衡导致的问题
  • Redis事务机制
  • [论文阅读]VGGFace2: A dataset for recognising faces across pose and age