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

什么是ThreadLocal

ThreadLocal 是 Java 提供的一个工具类,它为每一个使用该变量的线程都提供了一个独立的变量副本。换句话说:每个线程都有自己的本地变量副本、互不干扰。它不是用来共享数据的,而是用来隔离数据的。

一、为什么需要 ThreadLocal?

考虑一种场景:

  • 你写了一个工具类,这个类在多个线程中并发使用。

  • 你不希望多个线程共享某个变量(比如数据库连接、日期格式化器等),因为那样会造成线程安全问题

这时,就可以使用 ThreadLocal

二、ThreadLocal 的工作原理(简化版)

  • 每个线程对象(Thread)中都有一个 ThreadLocalMap

  • ThreadLocalMap 的 key 是 ThreadLocal 对象本身,value 是对应线程的本地变量副本。

  • 所以,ThreadLocal 实际上是“索引器”,你调用 .set().get(),它会到当前线程的 ThreadLocalMap 里查找对应的值。

三、简单例子

public class ThreadLocalExample {// 创建一个 ThreadLocal 变量private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();public static void main(String[] args) {Runnable task = () -> {// 给当前线程设置值threadLocal.set((int) (Math.random() * 100));try {Thread.sleep(100); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}// 获取当前线程的值System.out.println(Thread.currentThread().getName() + " 的值:" + threadLocal.get());};// 启动多个线程new Thread(task, "线程A").start();new Thread(task, "线程B").start();}
}

结果

线程A 的值:42
线程B 的值:87

 

四、常用方法

threadLocal.set(value);   // 设置当前线程的本地值
threadLocal.get();        // 获取当前线程的本地值
threadLocal.remove();     // 删除当前线程的本地值(避免内存泄漏)

五、ThreadLocal 的典型应用场景

  1. 数据库连接管理(如 MyBatis 中的事务控制)

  2. 用户登录信息传递(比如 Spring Security 使用 ThreadLocal 存储当前登录用户)

  3. 日志追踪(Trace ID)

  4. 非线程安全工具的线程隔离(如 SimpleDateFormat

七、注意事项:内存泄漏风险!

在使用线程池时,如果线程复用而你没有调用 ThreadLocal.remove() 清理数据,旧数据可能会一直存在于线程的 ThreadLocalMap 中,从而造成内存泄漏。

解决办法:

  • 用完及时调用 remove()

  • 使用 InheritableThreadLocal 支持线程继承。

  • 在框架中一般封装好,自己写业务逻辑时要留心。

 

相关文章:

什么是ThreadLocal

ThreadLocal 是 Java 提供的一个工具类&#xff0c;它为每一个使用该变量的线程都提供了一个独立的变量副本。换句话说&#xff1a;每个线程都有自己的本地变量副本、互不干扰。它不是用来共享数据的&#xff0c;而是用来隔离数据的。 一、为什么需要 ThreadLocal&#xff1f;…...

MySQL-SQL-DQL语句、DQL基本查询、DQL条件查询、DQL分组查询、聚合函数、DQL排序查询、DQL分页查询

一. DQL DQL&#xff1a;Data Query Language(数据查询语言)&#xff0c;用来查询数据库表中的记录。 关键字&#xff1a;SELETE -- DQL 完整语法select字段列表 from表名列表 where条件列表 group by分组字段列表 having分组后条件列表 order by排序字段列表 limit分页参数 …...

vue2 vue3 响应式差异

vue2 响应式原理看这 链接: link 总结&#xff1a; object.defineproperty()是对属性的劫持&#xff0c;对属性劫持有两大缺陷 1. 需要遍历对象的所有属性&#xff0c;深层属性需递归&#xff0c;存在效率问题 2. 后添加的属性&#xff0c;无法获得响应式&#xff0c;因为劫持…...

常见NLP模型发展脉络:从传统方法到大语言模型

自然语言处理作为人工智能领域的重要分支&#xff0c;经历了从传统统计方法到深度学习的巨大飞跃。本文将带你梳理NLP模型的发展脉络&#xff0c;回顾那些推动技术进步的重要里程碑。 一、统计学习阶段&#xff08;1990s-2010s初&#xff09; 早期的NLP模型主要基于统计方法&…...

Bert论文解析

文章目录 BERT&#xff1a;用于语言理解的深度双向转换器的预训练一、摘要三、BERT介绍BERT及其详细实现答疑&#xff1a;为什么没有标注的数据可以用来预训练模型&#xff1f;1. 掩码语言模型&#xff08;Masked Language Model, MLM&#xff09;2. 下一句预测&#xff08;Nex…...

【数学】勒让德定理(legendres-formula)详解

勒让德定理&#xff08;Legendre’s Formula&#xff09;详解 这段代码使用的数学原理是勒让德定理&#xff0c;它是计算质数p在n!的质因数分解中指数的核心方法。 一、定理内容 对于任意质数p和正整数n&#xff0c;p在n!的质因数分解中的指数&#xff08;即n!能被p整除的最…...

时空联合规划算法

本文主要讲解时空时空联合规划算法。 文章目录 前言一、时空联合规划基本概念1.1 EM Planner算法求解过程1.2 时空联合规划算法求解过程二、基于搜索的规划方法2.1 构建三维时空联合规划地图2.2 基于Hybrid A*的时空联合规划二、基于迭代搜索的规划方法2.1 这段时间更新中2.2 这…...

如何在idea中新建一个项目

Java通常展现的方式就是项目&#xff0c;但是在不熟悉idea的情况下&#xff0c;我们应该如何创建一个项目呢&#xff1f; 第一步&#xff1a;点击File-->New-->Project 第二步&#xff1a;选择 Empty Project 第三步&#xff1a;点击File-->找到Project Structure--&…...

设计模式简述(十三)适配器模式

适配器模式 描述基本使用使用关于适配器关联不兼容类的方式如果原有抽象层是抽象类若原有抽象是接口使用 描述 适配器模式常用于系统已经上限稳定运行&#xff0c;但现有需求需要将两个不匹配的类放到一起工作时使用。 也就是说这是一个迭代阶段使用的模式。 这种模式&#x…...

功耗日志抓取需求

最近罗列了一些功耗分析需要的常见日志&#xff1a; 测试功耗前&#xff1a; adb shell dumpsys batterystats --reset adb shell dumpsys batterystats --enable full-wake-history 测试功耗后&#xff0c;使用脚本导出如下功耗日志&#xff1a; 脚本 chmod x collect_logs.s…...

设计模式简述(十一)装饰器模式

装饰器模式 描述基本使用使用 描述 装饰器模式是一种功能型模式 用于动态增强对象的功能 这么一说感觉上和代理模式有些类似 抽象装饰器 要实现原有业务接口&#xff0c;并注入原有业务对象 至于对原有业务对象的调用&#xff0c;可以采用private业务对象 实现业务接口方法的…...

MongoDB基础知识

MongoDB基础知识 目录 基础篇 一、MongoDB入门指南&#xff08;零基础必读&#xff09;二、MongoDB简介三、MongoDB安装与配置四、MongoDB基本操作五、MongoDB查询操作 进阶篇 六、MongoDB索引七、MongoDB聚合操作八、MongoDB数据模型九、MongoDB安全十、MongoDB备份恢复十一…...

Kubernetes详细教程(一):入门、架构及基本概念

Kubernetes&#xff08;常简称为K8s&#xff09;是一个开源的平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。 官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/concepts/overview/components/ 一、入门 &#xff08;一&#xff09;Kubernetes是什么&am…...

架构思维:限流技术深度解析

文章目录 Pre业务场景熔断 VS 限流4大限流算法固定时间窗口计数滑动时间窗口计数漏桶令牌桶 方案实现使用令牌桶还是漏桶模式&#xff1f;在 Nginx 中实现限流还是在网关层中实现限流&#xff1f;使用分布式限流还是单机限流&#xff1f;使用哪个开源技术&#xff1f; 限流方案…...

批量改CAD图层颜色——CAD c#二次开发

一个文件夹下大量图纸&#xff08;几百甚至几千个文件&#xff09;需要改图层颜色时&#xff0c;可采用插件实现&#xff0c;效果如下&#xff1a; 转换前&#xff1a; 转换后&#xff1a; 使用方式如下&#xff1a;netload加载此dll插件&#xff0c;输入xx运行。 附部分代码如…...

vue猜词游戏

说明&#xff1a;我希望用vue实现猜词游戏 Vue Wordle 游戏规则总结 ​核心规则 ​单词选择 目标单词从预设词库&#xff08;DEFAULT_WORDS&#xff09;中随机选取&#xff0c;均为5字母单词&#xff08;如apple、zebra等&#xff09;。 ​输入要求 ​长度限制&#xff1a;必须…...

SQL ②-库操作 | 数据类型

这里是Themberfue SQL语法 数据库术语 DATABASE&#xff1a;数据库&#xff0c;保存有组织的数据的容器&#xff08;通常是一个文件或一组文件&#xff09;。TABLE&#xff1a;表&#xff0c;某种特定类型数据的结构化清单。SCHEMA&#xff1a;模式&#xff0c;关于数据库和表…...

云轴科技ZStack CTO王为@中国GenAI大会:AI原生实践重构AI Infra新范式

4月1-2日&#xff0c;2025中国生成式AI大会&#xff08;GenAICon 2025&#xff09;在北京举办&#xff0c;该会议已成为国内AI领域最具影响力的产业峰会之一。来自学术界与产业界的50位嘉宾围绕GenAI应用、大模型、AI智能体、具身智能、DeepSeek R1与推理模型等话题&#xff0c…...

处理甘特图启动依赖报错。

处理甘特图启动报错 一、修改甘特图下载地址1.1 配置修改1.2 修改地址(https://registry.npmmirror.com) 二、安装依赖1.1 安装sass-loader1.2 适配安装dhtmlx-gantt 一、修改甘特图下载地址 1.1 配置修改 npm config get registry1.2 修改地址(https://registry.npmmirror.c…...

JSX、支持HTML标签、Ref的使用、虚拟DOM的使用

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

leetcode376-摆动序列

leetcode 376 思路 变量定义&#xff1a; prediff&#xff1a;记录上一次相邻元素的差值。用于判断当前差值与上一个差值的关系curdiff&#xff1a;记录当前相邻元素的差值result&#xff1a;记录当前的摆动序列的长度&#xff0c;初始化为 1&#xff0c;因为至少一个元素就…...

内网渗透(杂项集合) --- 中的多协议与漏洞利用技术(杂项知识点 重点) 持续更新

目录 1. NetBIOS 名称的网络协议在局域网中内网渗透中起到什么作用 2. 使用 UDP 端口耗尽技术强制所有 DNS 查找失败&#xff0c;这个技术如何应用在局域网内网渗透测试中 3. 在本地创建一个 HTTP 服务来伪造 WPAD 服务器 什么是 WPAD 服务器&#xff1f;这个服务器是干嘛的…...

14-产品经理-维护计划

产品经理的另一个职责是制定计划。古人云&#xff0c;凡事预则立&#xff0c;不预则废。 产品需要做规划&#xff0c;才能有轻重缓急&#xff0c;才能正确的做事。因此对于产品经理而言&#xff0c;计划是必需的。 对于产品经理自己而言&#xff0c;发布计划可以帮助他规划产…...

12-产品经理-维护模块

需求模块是帮助产品经理进行需求的分类和维护。 1. 维护模块 在具体产品的“研发需求”页面左侧&#xff0c;点击“维护模块”。也可以在具体产品的“设置”-“模块”下进行维护。 点击保存后&#xff0c;返回模块页面。还可以点击“子模块”对已有模块进行子模块的维护。 点击…...

解析HiveQL的ALTER TABLE ADD/REPLACE COLUMNS语句

阅读以下ALTER TABLE的ADD/REPLACE COLUMNS语句的语法&#xff0c;用C#编写解析函数&#xff0c;一个一个字符解析&#xff0c;所有关键字不区分大小写&#xff0c;一个或多个空格、Tab和换行的组合都可以是关键词之间的分隔&#xff0c;表名和字段名可能包含空格和Tab&#xf…...

MySQL-SQL-DML语句、INSER添加数据、UPDATE更新数据、DELETE删除数据

一. DML 1. DML的英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 2. 添加数据(INSERT)&#xff1b;修改数据(UPDATE)&#xff1b;删除数据(DELETE) 二. DML-INSER添加数据 -- DML insert -- 指定字段添加数…...

学透Spring Boot — 017. 处理静态文件

这是我的《学透Spring Boot》专栏的第17篇文章&#xff0c;了解更多内容请移步我的专栏&#xff1a; Postnull CSDN 学透 Spring Boot 目录 静态文件 静态文件的默认位置 通过配置文件配置路径 通过代码配置路径 静态文件的自动配置 总结 静态文件 以前的传统MVC的项目…...

Linux进程间通信——共享内存

1.概念 共享内存&#xff08;Shared Memory&#xff09;就是允许多个进程访问同一个内存空间&#xff0c;是在多个进程之间共享和传递数据最高效的方式。操作系统将不同进程之间共享内存安排为同一段物理内存&#xff0c;进程可以将共享内存连接到它们自己的地址空间中&#x…...

如何在大型项目中组织和管理 Vue 3 Hooks?

众所周知,Vue Hooks(通常指 Composition API 中的功能)是 Vue 3 引入的一种代码组织方式,用于更灵活地组合和复用逻辑。但是在项目中大量使用这种写法该如何更好的搭建结构呢?以下是可供参考实践的案例。 一、Hooks 组织原则 单一职责每个 Hook 应专注于完成单一功能,避…...

前后端开发的未来趋势

随着技术的不断进步,前后端开发模式也在不断演变。未来,微服务架构、Serverless、前后端融合(GraphQL、BFF)等趋势将深刻影响开发方式,使应用更高效、灵活、可扩展。 1. 微服务架构与 Serverless 1.1 微服务架构(Microservices Architecture) 微服务是一种软件架构模式…...

产品经理课程

原型工具 一、土耳其机器人 这个说法来源于 1770 年出现的一个骗局&#xff0c;一个叫沃尔夫冈冯肯佩伦&#xff08;Wolfgang von Kempelen&#xff09;的人为了取悦奥地利女皇玛丽娅特蕾莎&#xff08;Maria Theresia&#xff09;&#xff0c;“制造”了一个会下国际象棋的机…...

【开源宝藏】30天学会CSS - DAY12 第十二课 从左向右填充的文字标题动画

用伪元素搞定文字填充动效&#xff1a;一行 JS 不写&#xff0c;效果炸裂 你是否曾经在设计页面标题时&#xff0c;觉得纯文字太寡淡&#xff1f;或者想做一个有动感的文字特效&#xff0c;但又不想引入 JS 甚至 SVG&#xff1f; 在这篇文章中&#xff0c;我们将通过 一段不到…...

Nginx 负载均衡案例配置

负载均衡案例 基于 docker 进行 案例测试 1、创建三个 Nginx 实例 创建目录结构 为每个 Nginx 实例创建单独的目录&#xff0c;用于存储 HTML 文件和配置文件 mkdir -p data/nginx1/html mkdir -p data/nginx2/html mkdir -p data/nginx3/html添加自定义 HTML 文件 在每个…...

Golang系列 - 内存对齐

Golang系列-内存对齐 常见类型header的size大小内存对齐空结构体类型参考 摘要: 本文将围绕内存对齐展开, 包括字符串、数组、切片等类型header的size大小、内存对齐、空结构体类型的对齐等等内容. 关键词: Golang, 内存对齐, 字符串, 数组, 切片 常见类型header的size大小 首…...

nginx中的limit_req 和 limit_conn

在 Nginx 中&#xff0c;limit_req 和 limit_conn 是两个用于限制客户端请求的指令&#xff0c;它们分别用于限制请求速率和并发连接数。 limit_req limit_req 用于限制请求速率&#xff0c;防止客户端发送过多请求影响服务器性能。它通过 limit_req_zone 指令定义一个共享内存…...

Python Cookbook-5.4 根据对应值将键或索引排序

任务 需要统计不同元素出现的次数&#xff0c;并且根据它们的出现次数安排它们的顺序——比如&#xff0c;你想制作一个柱状图。 解决方案 柱状图&#xff0c;如果不考虑它在图形图像上的含义&#xff0c;实际上是基于各种不同元素(用Python的列表或字典很容易处理)出现的次…...

U535982 J-A 小梦的AB交换

U535982 J-A 小梦的AB交换 - 洛谷 题目描述 小梦有一个长度为 2⋅n 的 AB 串 s&#xff0c;即 s 中只包含 "A" 和 "B" 两种字符&#xff0c;且其中恰好有 n 个 "A" 和 n 个 "B"。 他可以对 s 执行以下操作&#xff1a; 选择 i,j (…...

2025高频面试算法总结篇【排序】

文章目录 直接刷题链接直达把数组排成最小的数删除有序数组中的重复项求两个排序数组的中位数求一个循环递增数组的最小值数组中的逆序对如何找到一个无序数组的中位数链表排序从一大段文本中找出TOP K 的高频词汇 直接刷题链接直达 把一个数组排成最大的数 剑指 Offer 45. 把…...

计算机视觉基础4——特征点及其描述子

一、特征点检测 &#xff08;一&#xff09;特征点定义 图像中具有独特局部性质的点。 &#xff08;二&#xff09;特征点性质 具有局部性&#xff08;对遮挡和混乱场景鲁棒&#xff09;、数量足够多&#xff08;一幅图像可产生成百上千个&#xff09;、独特性&#xff08;…...

React 初学者进阶指南:从环境搭建到部署上线

概览 环境搭建 核心概念 TodoList 实战 部署上线 一、快速搭建 React 开发环境 1. 选型:Vite 或 Create React App Vite:轻量、热更新速度快、可定制度高,适合追求更高效率的开发者。Create React App (CRA):社区支持全面,文档丰富,适合初学者上手。我使用的是Vite 提示…...

​docker加docker compose实现软件快速安装启动

docker 下载镜像官网页面&#xff1a;https://hub.docker.com/ docker是什么&#xff1f; 加速应用构建、分享、运行 docker命令 镜像操作 容器操作 docker ps:查看运行中的容器 docker ps -a: 查看所有容器&#xff0c;包括停止的 除了docker run和docker exec两个命令其余执…...

使用人工智能大模型腾讯元宝,如何免费快速做工作总结?

今天我们学习使用人工智能大模型腾讯元宝&#xff0c;如何免费快速做工作总结&#xff1f; 手把手学习视频地址&#xff1a;https://edu.csdn.net/learn/40402/666429 第一步在腾讯元宝对话框中输入如何协助老师做工作总结&#xff0c;通过提问&#xff0c;我们了解了老师做工…...

【小兔鲜】day03 Home模块与一级分类

【小兔鲜】day03 Home模块与一级分类 1. Home-整体结构搭建和分类实现1.1 页面结构 2. Home-banner轮播图功能实现 1. Home-整体结构搭建和分类实现 1.1 页面结构 分类实现 2. Home-banner轮播图功能实现 轮播图实现 在HomeBanner.vue中写出轮播图的结构 在apis目录下新建h…...

c++使用gstreamer录屏+声音

说明&#xff1a; c使用gstreamer完成录制电脑桌面的功能 我希望用gstreamer录屏&#xff0c;默认10秒&#xff0c;自动保存录屏文件到本地 这里是不带声音的版本&#xff0c;仅录屏&#xff0c; step1:C:\Users\wangrusheng\source\repos\CMakeProject1\CMakeProject1\CMakeL…...

PowerToys:Windows高效工具集

Microsoft PowerToys 是微软官方推出的 ‌免费开源效率工具集‌&#xff0c;专为 Windows 系统设计&#xff0c;通过模块化功能解决高频操作痛点&#xff0c;提升用户生产力。支持 Windows 10/11 系统&#xff0c;覆盖开发者、设计师及普通办公场景‌。 一、核心功能亮点‌ ‌高…...

pulsar中的延迟队列使用详解

Apache Pulsar的延迟队列支持任意时间精度的延迟消息投递&#xff0c;适用于金融交易、定时提醒等高时效性场景。其核心设计通过堆外内存索引队列与持久化分片存储实现&#xff0c;兼顾灵活性与可扩展性。以下从实现原理、使用方式、优化策略及挑战展开解析&#xff1a; 一、核…...

import torch 失败

1. 使用 PyTorch 官方 Conda 频道安装 运行以下命令&#xff08;根据你的 CUDA 版本选择&#xff09;&#xff1a; # CPU 版本 conda install pytorch torchvision torchaudio cpuonly -c pytorch# CUDA 11.8 版本 conda install pytorch torchvision torchaudio pytorch-cud…...

什么是异步?

什么是异步&#xff1f; 异步是一个术语&#xff0c;用于描述不需要同时行动或协调就能独立运行的流程。这一概念在技术和计算领域尤为重要&#xff0c;它允许系统的不同部分按自己的节奏运行&#xff0c;而无需等待同步信号或事件。在区块链技术中&#xff0c;异步是指网络中…...

Llama 4 家族:原生多模态 AI 创新新时代的开启

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

情感语音的“开源先锋”!网易开源

语音合成技术近年来取得了显著进步&#xff0c;特别是在语音克隆、语音助手、配音服务和有声读物等领域。然而&#xff0c;如何让合成的语音更具情感&#xff0c;更贴近人类的真实表达&#xff0c;一直是这一领域的重要研究方向。今天&#xff0c;我们将为大家介绍一款由网易有…...