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<>();//保存当前线程处理的用户的用户IDpublic  static void  setCurrentId(Long id){threadLocal.set(id);}//获取当前线程处理的用户的用户IDpublic  static  Long getCurrentId(){return threadLocal.get();}//移除当前线程处理的用户的用户IDpublic static void removeCurrentId(){threadLocal.remove();}}

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

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

    @Testvoid 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.mzph.cn/pingmian/57669.shtml

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

相关文章

Android13关于获取外部存储文件的相关问题及解决方案记录

Android的学习路上... 测试设备&#xff1a;vivo X90s安卓版本&#xff1a; Android13开发环境&#xff1a;AndroidStudio FlamingoSDK&#xff1a;33 最近我在Android13的环境下尝试写一个文件选择器&#xff0c;以便日后的开发使用。但是我们知道&#xff0c;从Android13 (A…

django restful API

文章目录 项目地址一、django环境安装以及初识restful1.1 安装python 3.10的虚拟环境1.2 创建django工程文件1.3 创建一个book app1.4 序列化(Django JsonResponse)1.4.1创建一个Models1.4.2 创建django的超级用户admin1.4.3 添加serializers.py生成序列化器1.5 FBV创建视图1…

Vue3 + Element Plus 封装文本超出长度显示省略号,鼠标移上悬浮展示全部内容的组件

一、背景介绍&#xff1a; 基于Vue3 Element Plus的项目&#xff0c;多处出现展示超长文本&#xff0c;为了页面美观&#xff0c;笔者决定封装成Text组件&#xff0c;实现“文本超出长度显示省略号&#xff0c;鼠标移上悬浮展示全部内容”的功能。 二、封装的Text组件 <…

Mac 下安装FastDFS

首先我们需要下载相对应的安装包&#xff1a; libfastcommonFastDFS 下载完成后我们先将其解压到桌面。 1.安装libfastcommon 我们进入到libfastcommon-master目录中执行./make.sh和sudo ./make.sh install&#xff0c;具体代码如下&#xff1a; 2.安装FastDFS 同安装libfa…

用docker Desktop 下载使用thingsboard/tb-gateway

1、因为正常的docker pull thingsboard/tb-gateway 国内不行了&#xff0c;所以需要其它工具来下载 2、在win下用powershell管理员下运行 docker search thingsboard/tb-gateway 可以访问到了 docker pull thingsboard/tb-gateway就可以下载了 3、docker Desktop就可以看到…

Elasticsearch 与 Lucene 的区别和联系

Elasticsearch 与 Lucene 的区别和联系 Elasticsearch 与 Lucene 的区别和联系一、知识背景Elasticsearch 简介Lucene 简介 二、Elasticsearch 和 Lucene 的区别适用场景性能优势和劣势架构设计的异同点 三、Elasticsearch和Lucene的联系四、Elasticsearch和Lucene的应用案例及…

ComfyUI初体验

ComfyUI 我就不过多介绍了&#xff0c;安装和基础使用可以看下面大佬的视频&#xff0c;感觉自己靠图文描述的效果不一定好&#xff0c;大家看视频比较方便。 ComfyUI全球爆红&#xff0c;AI绘画进入“工作流时代”&#xff1f;做最好懂的Comfy UI入门教程&#xff1a;Stable D…

分布式ID生成策略

文章目录 分布式ID必要性1.UUID2.基于DB的自增主键方案3.数据库多主模式4.号段模式5.Redis6.Zookeeper7.ETCD8.雪花算法9.百度(Uidgenerator)10.美团(Leaf)11.滴滴(TinyID) 分布式ID必要性 业务量小于500W的时候单独一个mysql即可提供服务&#xff0c;再大点的时候就进行读写分…

nuScenes数据集使用的相机的外参和内参

因为需要用不同数据集测试对比效果&#xff0c;而一般的模型代码里实现的检测结果可视化都是使用open3d的Visualizer在点云上画的3d框&#xff0c;展示出来的可视化效果很差&#xff0c;可能是偷懒&#xff0c;没有实现将检测结果投影到各相机的图像上&#xff0c;所以检测效果…

[ARM-2D 专题]4. 快速搭建ARM2D的PC仿真开发环境及避坑手法

有几种情况你需要使用pc仿真开发环境&#xff1a; 手上没有合适的硬件条件只想快速的了解一下ARM-2D开发过程中&#xff0c;加速开发过程&#xff0c;避免频繁的下载代码 无论如何&#xff0c;pc仿真开发环境&#xff0c;你都值得拥有。 第一步&#xff0c;先下载源代码&#…

更改USB 网卡名称

在code/kernel-6.1/drivers/net/usb/usbnet.c文件中更 有几处地都可以改 最好在添加下面一行。但是要注意同时只能用一个usb网卡&#xff0c;多个不知道会怎么样 strcpy(dev->name,“eth1”); //第三处添加 usbnet_probe (struct usb_interface *udev, const struct usb_d…

基于ElementPlus的Form组件封装

前言 我们在项目开发过程中遇到最多就是表单页面的开发&#xff0c;那么使用频率比较高的就是Form组件&#xff0c;无论是vue亦或者是react&#xff0c;我们在项目中使用到UI库都会有Form组件。多数情况下都是用到了Form组件&#xff0c;我们先根据UI库或者其他类似的页面直接…

h5页面与小程序页面互相跳转

小程序跳转h5页面 一个home页 /pages/home/home 一个含有点击事件的元素&#xff1a;<button type"primary" bind:tap"toWebView">点击跳转h5页面</button>toWebView(){ wx.navigateTo({ url: /pages/webview/webview }) } 一个webView页 /pa…

一个vue3的待办列表组件

一个vue3的待办列表组件, 仿企业微信的待办列表 TodoList.vue <template><div><el-input v-model"todoInput" placeholder"写下你的待办事项..." class"el-input" keyup.enter"addTodo"input-style"background-c…

物联网行业应用实训室建设方案

一、建设背景 随着物联网技术的迅猛发展和广泛应用&#xff0c;物联网产业已跃升为新时代的经济增长引擎&#xff0c;对于产业升级和社会信息化水平的提升具有举足轻重的地位。因此&#xff0c;为了满足这一领域的迫切需求&#xff0c;培养具备物联网技术应用能力的优秀人才成…

自动发现-实现运维管理自动化

nVisual-Discovery是一款自动化工具软件&#xff0c;通过多种自动发现技术&#xff0c;协助运维管理人员快速建立可视化的网络文档&#xff0c;提升网络管理的效率与准确性。 01 IP扫描发现 当我们新接手一个网络运维项目&#xff0c;通常缺乏精准的网络文档数据&#xff0c;…

4.2-6 使用Hadoop WebUI

文章目录 1. 查看HDFS集群状态1.1 端口号说明1.2 用主机名访问1.3 主节点状态1.4 用IP地址访问1.5 查看数据节点 2. 操作HDFS文件系统2.1 查看HDFS文件系统2.2 在HDFS上创建目录2.3 上传文件到HDFS2.4 删除HDFS文件和目录 3. 查看YARN集群状态4. 实战总结 1. 查看HDFS集群状态 …

Docker部署MySQL主从复制

1. 主从复制概念及优势 1.1 概念 MySQL主从复制是一种数据库复制技术&#xff0c;它允许将一个数据库服务器&#xff08;主服务器&#xff09;上的数据更改复制到一个或多个数据库服务器&#xff08;从服务器&#xff09;。这种技术在数据库管理和维护中扮演着重要的角色&…

CSS 网格布局

网格布局是一个二维布局系统&#xff0c;允许开发者以行和列的形式创建灵活的网络&#xff0c;并将内容放置在网络的单元格中。有些元素可能只占据网络的一个单元&#xff0c;另一些元素则可能占据多行或多列。 网格的大小既可以精确定义&#xff0c;也可以根据自身内容自动计…

使用frp0.61.0透传局域网的https服务到自有域名

本文成因&#xff1a;我之前已经写过多个frphttps的文章&#xff0c;但因为frp版本升级后&#xff0c;更换了配置文件&#xff0c;其格式和之前差别比较明显&#xff0c;其次&#xff0c;之前的教程也过于繁杂&#xff0c;因此做出更新和改进。主要是展示各部分的配置文件&…