ThreadLocal通俗解读,举个例子?

ThreadLocal 解读

ThreadLocal 是 Java 中一个用来创建线程局部变量的类。它为每个使用该变量的线程提供独立的变量副本

线程局部变量意味着对于同一个 ThreadLocal 实例,在不同的线程中访问到的值是不同的,每个线程都有自己的变量副本。这样可以在多线程环境下保证变量的线程安全性。

————

先理解两个概念:

一个Java项目就占用操作系统一个进程,而Java自身又有两个线程概念:

1.系统线程:

是在 Java 程序运行时由 JVM(Java 虚拟机)底层创建和管理的线程。这些线程是 Java 自己的线程与操作系统的线程(例如 Windows、Linux 等)不同。Java 线程是由 JVM 虚拟出来的,对于操作系统来说,它们只是一个进程的内部实现,无法直接感知。

系统线程通常用于执行 Java 应用程序的各种任务,例如垃圾回收、编译优化、监控和管理等。

2.用户线程:

在理论上,一个系统线程(即由 JVM 管理的线程)可以处理数百个用户线程。例如:当一个用户线程遇到了 IO 操作,它会发起相应的 IO 请求,然后被挂起等待 IO 操作完成。在等待期间,系统线程可以选择去处理其他的用户线程,也可以执行一些其他的任务,例如处理其他用户线程的计算任务、执行垃圾回收等。

**用户线程是由程序员在 Java 应用程序中显式创建和调度的线程。**在 Java 中,程序员可以通过创建 Thread 对象或者实现 Runnable 接口来创建自己的线程,并通过调用 start() 方法启动线程。

每个用户线程都有自己的线程 ID,这个 ID 是由 JVM 分配的,用于标识当前线程的唯一标识符。

一个用户线程处理一个用户的一次请求,下一次请求可能是其他线程去处理了。

Java 线程池中的线程数量设置就是用来管理被提交到线程池执行的用户线程数量的(后续讲线程池)

————————

理解清楚了上面的两个线程概念后,举个生活中的例子方便大家理解ThreadLocal:

  • 可以将线程池、系统线程、用户线程等比喻为医院的工作人员,而 ThreadLocal 则是每个工作人员(护士)的大脑记忆。

一个程序就像一个医院,系统线程像是护士长,负责管理和分配任务给各个护士。每个用户线程就像是一个护士,她处理着用户的一次请求(病人的一次需求)。 而这时候ThreadLocal就是每个护士的大脑记忆它需要记住对应的病人的一次需求内容是啥(用来记录和存储当前正在处理的用户请求的相关信息)。可是情况不是固定的,病人可能有着很多的需求,病人可能前一会是想要测血压;几秒后又想打葡萄糖了,这样子这两个需求是不同的,这个时候的ThreadLocal就起到作用了,它是属于每个护士独立的记忆,所以这样需求对象就不会被覆盖啥的。(这样可以确保不同的用户请求不会相互干扰,避免出现数据错乱或混乱的情况。)

——————

内部方法:

threadLocal.set(T value):   设置线程内初始化实例对象。
threadLocal.get():   获取线程内该实例对象。
threadLocal.remove():   移除线程内实例对象。

——————

通常业务使用案例:

/*** 身份验证信息* 
*/
public class AuthenticationContextHolder
{private static final ThreadLocal<Authentication> contextHolder = new ThreadLocal<>();public static Authentication getContext(){return contextHolder.get();}public static void setContext(Authentication context){contextHolder.set(context);}public static void clearContext(){contextHolder.remove();}
}

起到了保存当前线程中的身份验证信息(Authentication 对象)的作用。

使得这个类允许在多线程环境下,将身份验证信息与当前线程关联起来,以便在整个线程执行过程中可以方便地访问和操作这个信息。

getContext():获取当前线程中的身份验证信息。通过调用这个方法,可以在任何地方获取到当前线程中的身份验证信息,而不需要显式地传递或者重新获取。

setContext(Authentication context):设置当前线程中的身份验证信息。通过调用这个方法,可以将身份验证信息保存到当前线程中,以便后续的操作使用。

clearContext()清除当前线程中的身份验证信息。通常在处理完请求或者身份验证过程结束后,需要调用这个方法来清理线程局部变量,以防止内存泄漏或者数据混乱。

————

很常见的操作是:

在业务逻辑中,也就是你可以根据他的角色进行对应的逻辑

获取当前用户ID
获取当前用户信息
获取当前用户权限

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/724453.shtml

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

相关文章

代码学习记录13

随想录日记part13 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.06 主要内容&#xff1a;今天的主要内容是二叉树的第二部分哦&#xff0c;主要有层序遍历&#xff1b;翻转二叉树&#xff1b;对称二叉树。 102.二叉树的层序遍历226.翻转二叉树101. 对称二叉…

MySQL用户创建和权限分配

MySQL用户创建和权限分配 用户创建 查看用户 select user,host from user; 创建用户 create user ‘用户名’ ‘host’ identified by 密码’; 删除用户 drop user ‘用户名’ ‘host’; 更新host update user set host ‘%’ where user 用户名‘&#xff1b; 权限分配 查…

逢7过,从任意一个数字开始报数,当你要报的数字包含7或者是7的倍数时都要说:过(1~100之间满足逢7必过规则的数据)

分析&#xff1a;这题就是碰到 7是个位&#xff0c;7是十位&#xff0c;7的倍数 就要过 // 1 2 3 4 5 6 过 8 9 10 11 12 13 过 14 15 16 过 18 19 20 过。。 69 过 过 过 过 过 。。80.。。 判断每个数字&#xff0c;如果符合条件&#xff0c;就打印过&#xff0c;如果不符…

2024中国重庆沐浴博览会5月29日-31日

2024中国沐浴展——世界级温泉胜地&#xff0c;引领健康产业新风向 2024第五届中国沐浴健康产业&#xff08;重庆&#xff09;博览会暨第十一届中国沐浴温泉文化节 ——世界级温泉胜地&#xff0c;引领健康产业新风向 随着人们生活水平的提高和健康意识的增强&#xff0c;沐…

LeetCode-第67题-二进制求和

1.题目描述 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 2.样例描述 3.思路描述 将两个二进制字符串转换成整型&#xff0c;然后相加后的整型转为二进制字符串 4.代码展示 class Solution(object):def addBinary(self, a, b):# 将字符串…

AI新工具(20240306) mlx-swift-chat Mac运行本地模型;Comflowyspace开源AI图像和视频生成工具

1: mlx-swift-chat 专为 Apple 硅片设计的高效机器学习框架&#xff0c;支持在本地实时运行 LLM 模型&#xff08;如 Llama、Mistral&#xff09; mlx-swift-chat 是一个为苹果系统&#xff08;例如你的笔记本电脑上的Apple Silicon&#xff09;特别设计的机器学习框架 MLX 的…

计划任务和日志

一、计划任务 计划任务概念解析 在Linux操作系统中&#xff0c;除了用户即时执行的命令操作以外&#xff0c;还可以配置在指定的时间、指定的日期执行预先计划好的系统管理任务&#xff08;如定期备份、定期采集监测数据&#xff09;。RHEL6系统中默认已安装了at、crontab软件…

前端如何实现高度的自动过渡

主要是利用了浏览器的渲染机制。 <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, mini…

linux系统elk组件kibana部署

Kibana部署 Kibana部署安装配置Kibana安装配置启动 安装配置Nginx反向代理配置YUM源&#xff1a;安装&#xff1a;配置反向代理 配置授权用户和密码启动nginx Kibana部署 安装配置Kibana 安装 tar zxf kibana-7.13.2-linux-x86_64.tar.gz -C /usr/local/配置 echo server.…

扫码看图的预览效果怎么做?图片的二维码如何在线生成?

图片二维码是现在很常用的一种预览图片的方式&#xff0c;比如照片、海报、动态图、拍摄的图片等类型的内容都可以用二维码的方式在手机上预览。在制作图片二维码时候&#xff0c;现在大多会通过网上的图片二维码生成器来制作&#xff0c;直接用专业的功能&#xff0c;就可以快…

SoraAI优先体验资格注册教程

SoraA1视频工具优先体验资格申请 申请网址&#xff1a;https://openai.com/form/red-teaming-network 申请步骤&#xff1a; 填写基础信息 请使用英文根据内容填写以下内容&#xff0c;名、姓、电子邮件、居住国家、组织隶属关系(如果有)、教育水平 、学位&#xff08;哪个领…

视频推拉流EasyDSS平台直播通道重连无法转推的原因排查与解决

视频推拉流EasyDSS视频直播点播平台&#xff0c;集视频直播、点播、转码、管理、录像、检索、时移回看等功能于一体&#xff0c;可提供音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务。 用户使用EasyDSS平台对直播通道进行转推&#xff0c;发现只要关闭…

大势智慧黄先锋:现实世界数字重建 拥抱AI 擘画自主可控的三维画卷

来源&#xff1a;中国地理信息产业协会 实景三维涉及到大面积、高精度的地理空间信息数据&#xff0c;然而早期国内99%以上的实景三维数据制作测绘单位都基于国外软件进行三维重建&#xff0c;如此重要的工作大量使用国外软件&#xff0c;如何确保国家地理空间信息的安全&#…

ONNX-TensorRT

ONNX 的 TensorRT 后端 解析 ONNX 模型以使用TensorRT执行。 另请参阅TensorRT 文档。 有关最近更改的列表&#xff0c;请参阅更改日志。 有关常见问题和疑问的列表&#xff0c;请参阅常见问题解答。 如需业务咨询&#xff0c;请联系Researchinquiriesnvidia.com 如需新闻…

JVM中CMS和G1垃圾回收器的区别

JVM&#xff08;Java虚拟机&#xff09;中的CMS&#xff08;Concurrent Mark-Sweep&#xff09;和G1&#xff08;Garbage First&#xff09;是两种用于垃圾回收的不同算法。它们都旨在减少垃圾回收对应用程序性能的影响&#xff0c;但它们的实现方式和重点略有不同。 CMS &…

音频设备的3种硬件接口- PCM,I2S和AC97

一、PCM接口 ​ ​针对不同的数字音频子系统&#xff0c;出现了几种微处理器或DSP与音频器件间用于数字转换的接口。最简单的音频接口是PCM&#xff08;脉冲编码调制&#xff09;接口&#xff0c;该接口由时钟脉冲&#xff08;BCLK&#xff09;、帧同步信号&#xff08;FS&a…

【MySQL】事务?隔离级别?锁?详解MySQL并发控制机制

目录 1.先理清一下概念 2.锁 2.1.分类 2.2.表锁 2.3.行锁&#xff08;MVCC&#xff09; 2.4.间隙锁 2.5.行锁变表锁 2.6.强制锁行 1.先理清一下概念 所谓并发控制指的是在对数据库进行并发操作时如何保证数据的一致性和正确性。在数据库中与并发控制相关的概念有如下几…

android开发基础有哪些,985研究生入职电网6个月

不好意思久等了 这篇文章让小伙伴们久等了。 一年多以来&#xff0c;关于嵌入式开发学习路线、规划、看什么书等问题&#xff0c;被问得没有一百&#xff0c;也有大几十次了。但是无奈自己对这方面了解有限&#xff0c;所以每次都没法交代&#xff0c;搞得实在不好意思。 但…

python之十进制转化成n进制

思路&#xff1a;除以n得商取模&#xff0c;然后再用商除以n得商取模&#xff0c;依此类推&#xff0c;直到商为0&#xff0c;最后将余数逆序输出即为结果 核心代码 result "" # 结果 while x > 0:a x % n # 余数result result str(a)x x // n # 商prin…

js需要同时发起百条接口请求怎么办?--通过Promise实现分批处理接口请求

如何通过 Promise 实现百条接口请求&#xff1f; 实际项目中遇到需要批量发起上百条接口请求怎么办&#xff1f; 最新案例代码在此&#xff01;点击看看 前言 不知你项目中有没有遇到过这样的情况&#xff0c;反正我的实际工作项目中真的遇到了这种玩意&#xff0c;一个接口…