首页 > 其他分享 >ThreadLocal的使用以及原理

ThreadLocal的使用以及原理

时间:2024-11-01 17:34:58浏览次数:1  
标签:变量 Thread ThreadLocalMap 对象 ThreadLocal 线程 使用 原理

ThreadLocal的使用以及原理

   概要

   ThreadLocal 是 java 提供的一个方便对象在本线程内不同方法中进行传递和获取的类。用它定义的变量,仅在本线程中可见和维护,不受其他线程的影响,与其他线程相互隔离。

   一、ThreadLocal能解决什么问题?

   当涉及一个对象需要在很多不同方法之间传递时,应该考虑使用 ThreadLocal 对象来简化代码。

   1.  线程专属的本地变量

   通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?JDK 中自带的ThreadLocal类正是为了解决这样的问题。

   2. 方法参数传递

   虽然在本线程不同方法中使用变量,可以通过在方法中传入参数解决,但是当涉及多个方法甚至多个类时,为每个方法增加同样的参数将是一场噩梦,此时 ThreadLocal 就能很好地解决这个问题。它可以在本线程内任何一个地方赋值,在任何一个地方获取值,并且不用作为函数参数传入。

   3. ThreadLocal 线程隔离

   上面第2点提到的,静态成员变量也能解决。但是ThreadLocal 变量相比静态成员变量的一个优势就是,ThreadLocal 是线程隔离的,其值不会受另一个线程的影响,也不用考虑加锁或值被其他线程篡改的问题,而这些问题都是静态成员变量无法做到的。

   二、ThreadLocal的使用场景

   典型场景2: 每个线程内需要保存全局变量(例如在拦截器中获取用户信息),可以让不同方法直接使用,避免参数传递的麻烦。

   三、ThreadLocal原理

   ThreadLocal 能在每个线程间进行隔离,其主要是靠在每个 Thread 对象中维护一个 ThreadLocalMap 来实现的。因为是线程中的对象,所以对其他线程不可见,从而达到隔离的目的。之所以是Map结构,主要是因为一个线程中可能有多个 ThreadLocal 对象,这就需要一个集合来进行存储区分,而用 Map 可以更快地查找到相关的对象。

   1. ThreadLocalMap

   ThreadLocalMap 是 ThreadLocal 对象的一个静态内部类,内部维护一个 Entry 数组,实现类似 Map 的 get 和 put 等操作,为简单起见,可以将其看做是一个 Map,其中 key 是 ThreadLocal 实例,value 是 ThreadLocal 实例对象存储的值。


   2. set

   当调用 ThreadLocal 的 set 方法给变量设置值时,ThreadLocal 对象会先获取本线程的 ThreadLocalMap 对象,然后将当前的 ThreadLocal 对象及要设置值作为键值对放入 Map 中。

   部分源码如下:

 1 public void set(T value) {
 2 // 获取当前请求的线程
 3     Thread t = Thread.currentThread();
 4 
 5     // 取出Thread 类内部的 threadLocals 变量(哈希表结构)
 6     ThreadLocalMap map = getMap(t);
 7     if (map != null)
 8         // this 指当前的 ThreadLocal 对象,将需要存储的值放入到这个哈希表中
 9         map.set(this, value);
10     else
11         // key 不存在,则创建 map 并设置值
12         createMap(t, value);
13 }
14 
15 ThreadLocalMap getMap(Thread t) {
16     // threadLocals 是 Thread 中的一个变量,因此是线程隔离的,不会受其他线程影响
17     // 其在 Thread 类中的定义如下:ThreadLocal.ThreadLocalMap threadLocals = null;
18     return t.threadLocals;
19 }

 

    参考链接:

    https://juejin.cn/post/6844904016288317448

标签:变量,Thread,ThreadLocalMap,对象,ThreadLocal,线程,使用,原理
From: https://www.cnblogs.com/hld123/p/18520904

相关文章

  • 【MemTester】内存测试工具Memtester使用方法
    1.MemTester简介MemTester是一个用于压力测试内存子系统的工具,它特别有效于发现间歇性和非确定性的故障。以下是MemTester的一些主要特点和功能:内存错误捕获:MemTester主要用于捕获内存错误和识别一直处于高或低电平的坏位。多种测试项目:它提供了一系列测试项目,包括随机值测试......
  • 手动搭建koa+ts项目框架(部署服务器使用pm2启动,并设置相关环境变量)
    文章目录前言一、什么是pm2?pm2是一个进程管理工具,可以用它来管理你的node进程,并查看node进程的状态,当然也支持性能监控,进程守护,负载均衡等功能二、配置环境变量1、配置`ecosystem.config.js`文件2、配置`pm2.json`文件总结`如有启发,可点赞收藏哟~`前言接着手动......
  • 在CSS中如何使用变量改善样式管理
    在CSS中使用变量可极大改善样式管理,关键在于:1、灵活定义可复用的值、2、简化主题更换流程、3、提高代码的可维护性。例如,定义主题颜色,当需要更改颜色主题时,只需修改变量值即可,避免了逐一更改多个CSS属性值的麻烦。CSS变量(也称为“自定义属性”)允许开发者存储一些可被重用的值,通过......
  • 排序算法:从原理到 Java 实现
    文章目录排序算法:从原理到Java实现一、引言二、常见排序算法原理及Java实现(一)冒泡排序(BubbleSort)(二)选择排序(SelectionSort)(三)插入排序(InsertionSort)(四)快速排序(QuickSort)(五)归并排序(MergeSort)(六)堆排序(HeapSort)三、性能比较与分析(一)时间复杂度(二)空间复杂度(三)稳定......
  • 在使用echarts绘制图表时, 如果需要使用渐变色, 则应使用echarts内置的渐变色生成器ec
    series:[{name:'',type:'bar',barMaxWidth:20,label:{show:true,color:'#fff',},showBackground:true,backgroundStyle:{color:'#d5f1f9&......
  • 【原理】Redis热点Key自动发现机制和客户端缓存方案
    作者:京东物流京东物流本文详细讲解下Redis热点key发现机制+客户端缓存的原理。一、redis4.0之基于LFU的热点key发现机制业务中存在访问热点是在所难免的,然而如何发现热点key一直困扰着许多用户,redis4.0为我们带来了许多新特性,其中便包括基于LFU的热点key发现机制。Redis中的L......
  • 【Java】ThreadLocal详解
    引言在多线程编程中,如何安全地共享数据是一个重要的课题。Java提供了ThreadLocal类,以便在每个线程中维护线程局部变量,允许每个线程拥有自己的独立变量副本。本文将探讨ThreadLocal的工作原理、使用场景以及一些最佳实践。1.什么是ThreadLocal?ThreadLocal是Java......
  • 14. 使用子查询
    1.子查询SELECT语句是SQL的查询。迄今为止我们所看到的所有SELECT语句都是简单查询,即从单个数据库表中检索数据的单条语句。补充:查询(query):任何SQL语句都是查询。但此术语一般指SELECT语句。SQL还允许创建子查询(subquery),即嵌套在其他查询中的查询。2.利用子查询进行过......
  • 离岗检测视频分析网关AI智能分析在岗离岗检测算法的原理与应用
    在岗离岗检测算法是一项利用计算机视觉和深度学习技术的应用,它通过解析监控视频流来辨认和追踪人员,进而确定他们是否处于特定的工作区域内。算法网关视频分析网关在众多领域中都有着重要的应用价值,特别是在那些需要确认员工在岗状态的场景中,例如在工厂、仓库、银行、医院等场所。......
  • 详细介绍磁珠的工作原理
    磁珠在电路中也是用得非常多的,下面是一些经常会看到的知识点,或者说是经验吧。①电感的单位是亨H,磁珠的单位是欧姆Ω②电感是储存能量的,磁珠是通过发热来消耗能量的③磁珠是用来吸收超高频信号,多用于信号回路及EMC对策不知道同志们想过没有,这些结论是怎么来的呢?要理解......