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

JavaWeb合集15-线程局部变量ThreadLocal

十五、ThreadLocal

ThreadLocal并不是一个Thread,,而是Thread的局部变量。

ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。

场景:通过过滤器/过滤器获取到JWT ,可将JWT值存储到ThreadLocal中,当执行到需要JWT的地方是可以进行取出使用(当前线程内)。

主要用途

  1. 数据隔离:在多线程环境中,确保每个线程都有自己的变量副本,避免线程之间的数据干扰。
  2. 状态保持:在同一个线程的不同方法调用之间保持状态,而不需要通过参数传递。
  3. 资源管理:在每个线程中管理资源,如数据库连接、Session 等。

常见方法/使用

ThreadLocal常用方法说明
public void set( T value )设置当前线程的线程局部变量的值
public T get()获取当前所对应线程局部变量的值
public void remove()删除当前线程的线程局部变量
  • set(T value):设置当前线程的 ThreadLocal 变量的值。
  • get():获取当前线程的 ThreadLocal 变量的值。
  • remove():移除当前线程的 ThreadLocal 变量的值。
  • initialValue():返回此线程局部变量的初始值。默认返回 null,可以通过 withInitial 方法提供自定义的初始值。

ThreadLocal 线程工具类,保存当前线程处理的用户的用户ID(或其他ID)

/**
 * ThreadLocal 线程工具类,保存当前线程处理的用户的用户ID(或其他ID)
 */
public class BaseContext {

    private static ThreadLocal <Long>  threadLocal=new ThreadLocal<>();

    //保存当前线程处理的用户的用户ID
    public  static void  setCurrentId(Long id)
    {
        threadLocal.set(id);
    }
    //获取当前线程处理的用户的用户ID
    public  static  Long getCurrentId()
    {
        return threadLocal.get();
    }

    //移除当前线程处理的用户的用户ID
    public static void removeCurrentId()
    {
        threadLocal.remove();
    }

}

测试:通常情况下,我们在拦截器或过滤器,对用户信息验证(token)通过后,就将用户id保存起来。

用户每次请求都会携带token,每请求一次都会进行重新保存用户信息。

    @Test
    void threadLocalTest(){
        //模拟用户信息(比如token解析成功后得到的用户信息)
       Map <String, Object> user = Map.of("id", 1, "username", "yhzy");
        //将用户信息保存到ThreadLocal中,
        BaseContext.setCurrentId(Long.parseLong(user.get("id").toString()));
        //获取用户信息,只要是当前线程,那么项目中的任何地方都可以获取到该用户信息
        System.out.println(BaseContext.getCurrentId());
    }

http://www.kler.cn/news/364043.html

相关文章:

  • 什么是虚拟线程?Java 中虚拟线程的介绍与案例演示
  • 【python实操】python小程序之参数化以及Assert(断言)
  • 【机器学习】VQ-VAE(Vector Quantized Variational Autoencoder)
  • 【动态规划】子序列问题(上)
  • 图像处理中的图像重建
  • JVM的内存模型是什么,每个区域的作用是什么,以及面试题(含答案)
  • sentinel原理源码分析系列(八)-熔断
  • 十六、行为型(责任链模式)
  • 2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(三级)答案 + 解析
  • PHP企业门店订货通进销存系统小程序源码
  • 定位中的信号干扰与噪声处理
  • 手机群控软件苹果iOS批量控制进化历程 解析及最新动态
  • 普通数组矩阵
  • 西南大学软件专硕考研难度分析!
  • 配置观察端口
  • 【主机漏洞扫描常见修复方案】:Tomcat安全(机房对外Web服务扫描)
  • 图集短视频去水印云函数开发实践——小红书
  • 小白投资理财 - 解读市销率,市现率
  • 新电脑Win11家庭中文版跳过联网激活方法(教程)
  • Go 语言教程:8.数组
  • 毕业设计 基于STM32单片机健康检测/老人防跌倒系统 心率角度检测GSM远程报警 (程序+原理图+元件清单全套资料)
  • 基于springboot企业微信SCRM管理系统源码带本地搭建教程
  • python学习之路 - python进阶【闭包、装饰器、设计模式、多线程、socket、正则表达式】
  • centos-LAMP搭建与配置(论坛网站)
  • 20241024拿掉飞凌OK3588-C的开发板linux R4启动时的LOGO
  • NSSCTF