ThreadLocal从入门到精通

news/2024/11/13 9:24:19/

1.ThreadLocal是什么

ThreadLocal 是 Java 提供的一个用于线程存储本地变量的类。它为每个线程提供独立的变量副本,确保变量在多线程环境下的线程安全。每个线程访问 ThreadLocal 时,都会有自己专属的变量副本,互不干扰,避免了并发访问时共享变量的竞争问题。
主要作用:
● 线程隔离:ThreadLocal 提供了线程之间的数据隔离。当多个线程操作同一个对象时,可以通过 ThreadLocal 为每个线程分配一个独立的变量副本,从而避免多线程间的变量共享导致的数据不一致问题。
● 解决并发问题:在高并发场景下,ThreadLocal 可以用来存储线程相关的状态信息,这样可以减少线程间的竞争,提高程序的并发性能。
● 可以跨层,跨类跨方法传递变量
● 简化代码:使用 ThreadLocal 可以简化多线程环境下的编程模型,使得线程局部变量的访问变得像访问普通变量一样简单。

2.ThreadLocal的工作原理

ThreadLocal 的核心机制是为每个线程创建一个独立的变量副本,并且这个副本是存储在线程自身的内部结构中,而不是 ThreadLocal 实例中。它主要依赖于 Thread 类中的 ThreadLocalMap 来实现这一功能。

  1. ThreadLocalMap每个 Thread 对象内部维护了一个 ThreadLocalMap,用于存储线程的本地变量。
    ThreadLocalMap 是一个类似于哈希表的结构,其中 ThreadLocal 对象作为键,线程的本地变量副本作为值。
    ● 每次线程调用 ThreadLocal.set() 方法时,实际上是将变量存储到该线程的 ThreadLocalMap 中,ThreadLocal 实例作为键。
    ● 当线程调用 ThreadLocal.get() 方法时,会从当前线程的 ThreadLocalMap 中读取与 ThreadLocal 对象相关联的值。
  2. 弱引用的使用
    ThreadLocalMap 使用了弱引用来引用 ThreadLocal 对象,这意味着如果某个 ThreadLocal 实例没有被其他对象强引用时,Java 垃圾回收器(GC)可以对其进行回收,避免内存泄漏。为了避免出现内存泄漏风险,开发者应该在使用完 ThreadLocal 变量后,主动调用 remove() 方法清理资源。
  3. 主要方法
    ● set(T value):将当前线程的局部变量值存储到 ThreadLocalMap 中。
    ● get():获取当前线程的局部变量值。如果是第一次访问,没有值时,调用 initialValue() 设置默认值。
    ● remove():移除当前线程的局部变量,如不移除,会一直在脑门上,占用内存空间,导致的内存泄漏。

3.ThreadLocal的使用场景

1.用户会话管理:
● 在处理 HTTP 请求时,每个线程都代表一个用户请求。可以使用 ThreadLocal 来存储每个线程的会话信息,如用户 ID、认证信息、角色等,保证线程间的会话信息独立。

java">
public class UserSessionContext {private static final ThreadLocal<UserSession> contextHolder = new ThreadLocal<>();public static void set(UserSession session) {contextHolder.set(session);}public static UserSession get() {return contextHolder.get();}public static void remove() {contextHolder.remove();}
}

2.数据库连接管理:
● 在一些数据库操作中,每个线程可能需要维护一个数据库连接。通过 ThreadLocal,可以确保每个线程都有一个独立的数据库连接,避免了多个线程竞争同一个连接。
3.事务管理:
● 在事务管理中,可以通过 ThreadLocal 来确保每个线程拥有独立的事务状态,从而保证事务的原子性和隔离性,因为事物的提交或者回滚是基于一条数据库连接的,使用这个可以确保使用一条连接
● Spring 的 TransactionSynchronizationManager 就是通过 ThreadLocal 来存储当前线程的事务上下文信息。
4.日志记录:
● 可以在日志系统中使用 ThreadLocal 存储线程级别的上下文信息,比如 requestId 或 traceId,这样在整个请求链中都可以记录统一的上下文信息,方便追踪日志。


http://www.ppmy.cn/news/1545906.html

相关文章

Spring Boot 的核心原理和工作机制

1. 自动配置 (Auto-configuration) Spring Boot 的自动配置机制是它最引人注目的特性之一。它基于 Spring 的条件化配置&#xff08;Conditional Configuration&#xff09;&#xff0c;允许 Spring Boot 根据类路径上的依赖和 Bean 的存在来决定如何配置应用。以下是自动配置的…

Rust常用数据结构教程 序列

文章目录 一、Vec1.Vec与堆栈2.什么时候需要Vec3.get()方法4.与枚举的结合 二、VecDeque1.什么情况适合VecDeque2.VecDeque的方法 三、LinkedList1.什么时候用LinkedList 参考 一、Vec 可变数组(vector)数组存储在heap上,在运行时(runtime)可以增加或减少数组 长度 有人把Ve…

怎样使用pycharm中的服务?

在PyCharm中使用服务&#xff0c;你需要执行以下步骤&#xff1a; 打开PyCharm&#xff0c;并在项目中创建一个新的Python文件。在Python文件中&#xff0c;编写你的代码来创建和使用服务。根据你想要使用的服务类型&#xff0c;可能需要安装相关的库或模块。在PyCharm的菜单栏…

Springboot+thymeleaf结合Vue,通过thymeleaf给vue赋值解决Vue的SEO问题

通过结合Spring Boot、Thymeleaf和Vue&#xff0c;可以充分利用Thymeleaf的服务端渲染功能&#xff0c;解决Vue全客户端渲染带来的SEO问题。以下是结合上述SEO优化重点的具体实现思路&#xff1a; 1. 在服务端渲染Title标签关键词 在Spring Boot控制器中定义页面的标题&#…

Vue全栈开发旅游网项目(9)-用户登录/注册及主页页面开发

1.用户登录页面开发 1.查询vant组件 2.实现组件模板部分 3.模型层准备 4.数据上传 1.1 创建版权声明组件Copyright 新建文件&#xff1a;src\components\common\Copyright.vue <template><!-- 版权声明 --><div class"copyright">copyright xx…

vue+exceljs前端下载、导出xlsx文件

首先安装插件 npm install exceljs file-saver第一种 简单导出 //页面引入 import ExcelJS from exceljs; import {saveAs} from file-saver; export default {methods: { /** 导出操作 */async handleExportFun() {let that this// 获取当前年月日 用户下载xlsx的文件名称设…

无人机之飞行管控平台篇

无人机的飞行管控平台是一种基于互联网和物联网技术的智能管理系统&#xff0c;旨在实现对无人机飞行任务的全自动化、全过程化管理。 一、主要功能 飞行计划管理&#xff1a;用户可以通过平台提前设置好无人机的飞行计划&#xff0c;包括起飞时间、航线、飞行高度等信息。平…

《EasyQuotation 与MongoDB在股市信息的奇妙融合》

《EasyQuotation 与MongoDB在股市信息的奇妙融合》 一、EasyQuotation 的强大功能二、数据存入 MongoDB&#xff08;一&#xff09;配置与连接&#xff08;二&#xff09;存储方法 三、K 线图监视股市信息&#xff08;一&#xff09;自定义性能趋势图表&#xff08;二&#xff…