写个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.pswp.cn/web/88233.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88233.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88233.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端Web实战(项目管理)

Restful风格 我们的案例是基于当前最为主流的前后端分离模式进行开发 在前后端分离的开发模式中&#xff0c;前后端开发人员都需要根据提前定义好的接口文档&#xff0c;来进行前后端功能的开发。 后端开发人员&#xff1a;必须严格遵守提供的接口文档进行后端功能开发&#…

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph

Leetcode 3604. Minimum Time to Reach Destination in Directed Graph 1. 解题思路2. 代码实现 题目链接&#xff1a;3604. Minimum Time to Reach Destination in Directed Graph 1. 解题思路 这一题思路上就是一个广度优先遍历&#xff0c;我们不断考察当前时间点以及位置…

OpenXR Runtime切换工具-OpenXR-Runtime-Switcher

在开发VR时&#xff0c;有时有多个设备&#xff0c;大家可能也会选择不同的串流工具&#xff0c;OpenXR类似于默认浏览器&#xff0c;如果设置错误可能导致游戏无法串流。 推荐一个工具&#xff0c;可以设置默认的OpenXR工具。 OpenXR-Runtime-Switcher 对于没有的设备&#…

Opencv探索之旅:从像素变化到世界轮廓的奥秘

在你已经能熟练地为图像施展“降噪”、“缩放”等魔法之后&#xff0c;你的探索之旅来到了一个全新的领域。你可能会好奇&#xff1a;我们人类能轻易地识别出照片中杯子的边缘、建筑的轮廓&#xff0c;那计算机是如何“看见”这些边界的呢&#xff1f;仅仅依靠滤波和颜色变换&a…

Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南

背景场景 在 Ubuntu 系统中使用 apt 或 deb 包方式安装 MySQL 8 时&#xff1a; 初次安装后会自动初始化数据库&#xff1b;但 没有提示 root 初始密码&#xff1b;导致 mysql -u root -p 无法登录。 为了解决该问题&#xff0c;通常我们使用 --skip-grant-tables 方式跳过权限…

题解:P13017 [GESP202506 七级] 线图

首先明白定义&#xff1a; 线图 L(G)L(G)L(G) 的顶点对应原图 GGG 的边&#xff0c;当且仅当原图中的两条边有公共顶点时&#xff0c;对应的线图顶点之间有一条边。 不难想到&#xff0c;对于原图中的每个顶点 vvv&#xff0c;其度数 d(v)d(v)d(v) 对应的边集可以形成 (d(v)2)\…

c++ duiLib环境集成2

继续上一篇&#xff0c;现在需要把控制台隐藏&#xff0c;只显示调用duiLib框架显示的窗口。右键项目 → 属性 → 链接器 → 系统 → ‌子系统‌改为 窗口(/SUBSYSTEM:WINDOWS)。原来是这样&#xff1a;修改为&#xff1a;运行报错&#xff1a;需要修改入口函数为WinMain。如下…

常见的网络攻击方式及防御措施

常见的网络攻击方式及防御措施&#xff1a;全面解析网络安全威胁 前言肝文不易&#xff0c;点个免费的赞和关注&#xff0c;有错误的地方请指出&#xff0c;看个人主页有惊喜。 作者&#xff1a;神的孩子都在歌唱在信息化高速发展的今天&#xff0c;网络安全威胁无处不在&#…

JavaScript 中导入模块时,确实不需要显式地写 node_modules 路径。

1. 正确的导入语法在 Webpack、Vite 等打包工具中&#xff0c;node_modules 目录是默认的模块搜索路径&#xff0c;因此直接写包名即可&#xff1a;// ✅ 正确&#xff1a;直接使用包名import nprogress/nprogress.css;// ❌ 错误&#xff1a;不需要显式写 node_modules 路径im…

ELK Stack技术栈

文章目录一、日志收集所解决的问题二、Elastic Stack 组件介绍2.1 Elasticsearch2.2 Logstash2.3 Kibana2.4 Filebeat beats三、ELK Stack集群安装3.1 安装JAVA环境&#xff08;所有ES节点&#xff09;3.2 安装ES集群3.2.1 ES单节点部署3.2.2 ES JAVA调优&#xff1a;堆(heap)内…

大腾智能国产 3D CAD:设计自由度拉满,数据安全锁死

在智能制造与数字化转型的浪潮中&#xff0c;大腾智能CAD作为一款自主研发的三维计算机辅助设计软件&#xff0c;凭借其从概念设计到制造落地的全流程覆盖能力&#xff0c;正成为国产工业设计软件领域的新锐力量。软件深度融合先进建模技术与工程实践需求&#xff0c;为机械制造…

ubuntu 操作记录

1&#xff1a;安装minicom 1: sudo apt-get install minicom minicom -s 2&#xff1a;Ctrl Z C 的区别 ctrlz的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令…

深度剖析:向70岁老系统植入通信芯片——MCP注入构建未来级分布式通信

> 如何让老旧系统重获新生?协议注入技术是关键。 ## 一、当遗留系统遇上分布式未来:一场艰难的对话 想象一下:你负责维护一套诞生于20年前的单体式银行核心系统,它像一位固执的70岁老人,使用着陈旧的TCP自定义协议。这时业务部门要求实现与云原生风险分析引擎的实时…

针对 SSD 固态硬盘的安全擦除 Secure Erase

SSD 的安全擦除&#xff08;Secure Erase&#xff09;用于永久删除存储介质上的数据&#xff0c;以及在驱动器性能开始明显下降至低于标称值时恢复其速度。Secure Erase 可以解决的问题核心当 SSD 开始运行缓慢&#xff08;读写数据变差&#xff09;时&#xff0c;这里有许多可…

Three.js搭建小米SU7三维汽车实战(3)轨道控制器

往期内容&#xff1a; Three.js搭建小米SU7三维汽车实战&#xff08;1&#xff09;搭建开发环境 Three.js搭建小米SU7三维汽车实战&#xff08;2&#xff09;场景搭建 轨道控制器 轨道控制器可以改变相机在空间坐标系中的位置 进而方便从不同的角度观察物体 1. 轨道控制器响…

C++树状数组详解

C树状数组深度解析 第1章 引言&#xff1a;为什么需要树状数组 1.1 动态序列处理的挑战 在现代计算机科学中&#xff0c;我们经常需要处理动态变化的序列数据&#xff0c;这类数据具有以下特点&#xff1a; 实时更新&#xff1a;数据点会随时间不断变化频繁查询&#xff1a;需要…

TeamT5-ThreatSonar 解决方案:构建智能动态的 APT 与勒索软件防御体系

一、核心功能深度解析&#xff1a;从威胁狩猎到自动化响应的闭环能力 &#xff08;一&#xff09;威胁狩猎&#xff1a;主动挖掘潜伏性攻击的 “数字侦探” 多层级威胁识别引擎&#xff1a; 静态特征匹配&#xff1a;内置超 1000 种 APT 后门签名&#xff08;如 Regin、Duqu 等…

C#基础篇(10)集合类之列表

C# 中的列表(List)详解列表(List)概述在C#中&#xff0c;List<T>是System.Collections.Generic命名空间中的一个泛型集合类&#xff0c;它提供了动态大小的数组功能&#xff0c;可以存储指定类型的元素。列表的创建与初始化// 创建一个空列表 List<int> numbers n…

SpringBoot订单模块核心接口设计与实现

目录 一、 管理端接口实现 (后台管理系统) 一、订单搜索 (高权重 - 核心管理功能) 1.Controller (OrderController): 2.Service (OrderService): 3.ServiceImpl (OrderServiceImpl): 1.使用MyBatis分页插件PageHelper 2.基础数据查询 4.Mapper (OrderMapper): 5.Mapper …

EXCEL链接模板无法自动链接到PowerBI?试试这个方法

在使用EXCEL链接模板连接PowerBI时&#xff0c;你有没有遇到如图所示的提示呢&#xff1a;下面我来分享一下&#xff0c;出现弹框的原因及解决方法&#xff1a;首先我们先看一下这个英文翻译&#xff0c;意思就是说&#xff0c;我们只能使一个PowerBI文件处于打开的状态&#x…