首页 > 编程语言 >JavaWeb合集15-线程局部变量ThreadLocal

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

时间:2024-10-24 16:19:26浏览次数:7  
标签:15 JavaWeb 用户 ID ThreadLocal 线程 当前 public

十五、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());
    }

标签:15,JavaWeb,用户,ID,ThreadLocal,线程,当前,public
From: https://blog.csdn.net/qq_57340195/article/details/143212210

相关文章

  • 代码随想录算法训练营第九天|leetcode151.翻转字符串里的单词、卡码网55.右旋字符串
    1leetcode151.翻转字符串里的单词题目链接:151.反转字符串中的单词-力扣(LeetCode)文章链接:代码随想录视频链接:字符串复杂操作拿捏了!|LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili自己的思路:直接将空格去掉,然后分割字符串为列表,在列表中进行翻转,不在字符串内部操作,......
  • 【开题报告+论文+源码】基于JavaWeb的中小学心理健康教育平台的设计与实现
    项目背景与意义在当今社会,随着生活节奏的加快和学习压力的增大,中小学生的心理健康问题日益凸显,引起了广泛关注。心理健康不仅关系到学生的个人成长与发展,还对整个社会的和谐稳定具有重要影响。因此,加强中小学生的心理健康教育,提高他们的心理素质,已成为当前教育领域的迫切需求......
  • ACDC电源模块BAG5-15W系列 双输出电源 BOSHIDA博士达
    ACDC电源模块BAG5-15W系列双输出电源BOSHIDA博士达产品具有以下特点:宽输入电压范围85-265VAC,适用于不同地区的电源电压标准。高效率、高可靠性,保证稳定而可靠的电源输出。空载功耗低,节约能源,减少不必要的电能损耗。隔离电压2500VAC,保证电源的安全性和稳定性。输出过压、过流......
  • Java“线程独享小金库”:揭秘 ThreadLocal 的妙用与陷阱
    前言在Java并发编程的世界里,线程间争抢资源犹如一场“抢椅子”游戏,稍有不慎就会碰撞出问题的火花。可是,想象一下,如果每个线程都有自己独享的“小金库”,再也不用担心其他线程来“顺手牵羊”,这该是多么惬意!没错,这就是ThreadLocal的魔力所在。它为每个线程量身定制独一无二的存......
  • JavaWeb开发实战详解
    JavaWeb开发在现代应用程序中有广泛的应用场景。以下是一些常见的JavaWeb应用类型及其示例:1.企业级应用特点:通常需要处理大量的数据和用户,具有复杂的业务逻辑,常用于企业内部。示例:客户关系管理(CRM)系统、企业资源计划(ERP)系统。技术栈:SpringFramework、Hibernate、JPA、Th......
  • leetcode刷题-1581. 进店却未进行过交易的顾客
    链接:1581.进店却未进行过交易的顾客-力扣(LeetCode)前提条件:表:Visits+-------------+---------+|ColumnName|Type|+-------------+---------+|visit_id|int||customer_id|int|+-------------+---------+visit_id是该表中具有唯一值的列。......
  • 《程序员修炼之道:从小工到专家》前15章至30章读后感
    在这一部分内容中,作者进一步强调了团队合作的重要性。编程往往不是一个人的战斗,而是团队共同努力的结果。良好的团队沟通和协作能够极大地提高开发效率,减少错误的发生。我们应该学会倾听他人的意见,尊重团队成员的想法,共同为实现项目目标而努力。同时,团队中也应该建立起有效的反馈......
  • 20222415 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    1.实验内容本周学习了后门技术,包括后门的概念和实现方式,学习了后门攻击的过程和实践;并且初步学习了免杀。2.实验过程2.1使用netcat获取主机操作Shell,cron启动某项任务(1)使用netcat获取主机操作虚拟机登录root,主机在cmd窗口输入ncat.exe-l-p8888Linux虚机输入指令nc192.16......
  • 洛谷 P2680 [NOIP2015 提高组] 运输计划 做题记录
    首先题目要求最大的最小,我们二分答案,对于每个答案,我们筛出比它长的路径,找到它们最长的公共边,删掉后验证正确性即可。找公共边可以用树上差分来做,时间复杂度\(O(m\logn\logV)\),其中\(V\)是二分区间大小。你会发现你挂了一堆点,让我们来卡常:首先预处理出所有节点的\(dfn\),每......
  • 【K8S系列】K8S集群 15个 常见问题及解决方案总结,建议收藏
    在Kubernetes集群的使用过程中,用户可能会遇到各种问题。以下是15个常见问题及其详细描述、故障排查步骤、常见错误信息和解决方案,帮助用户更有效地管理和维护Kubernetes环境。1.Pod初始化失败问题Pod处于Init:CrashLoopBackOff或Init:Error状态。故障排......