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

thradlocal

ThreadLocal笔记

介绍:

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

常用方法:

  • public void set(T value) 设置当前线程的线程局部变量的值
  • public T get() 返回当前线程所对应的线程局部变量的值
  • public void remove() 移除当前线程的线程局部变量
image-20221111212349365

封装 ThreadLocal 工具类:


public class BaseContext {public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();public static void setCurrentId(Long id) {threadLocal.set(id);}public static Long getCurrentId() {return threadLocal.get();}public static void removeCurrentId() {threadLocal.remove();}}

失效案例:

线程隔离导致ThreadLocal上下文失效为Null案例:

登录线程:

image-20250729180924473image-20250729181033261

修改密码线程:

image-20250729181114269

image-20250729181134897

线程隔离导致获取的上下文值为空null

解决方法:拦截器跟每个线程都一起为一个中的:

image-20250729181233596

根本原因:

  • 登录接口和修改密码接口是两个不同的HTTP请求,每个请求都由独立的线程处理。
  • BaseContext(ThreadLocal)存储的变量是线程隔离的,即每个线程拥有自己独立的副本。
  • 在登录请求的线程中设置empId,并不会影响到修改密码请求的线程。
解决方案:
  • 用户登录成功后,在拦截器(或过滤器)中统一设置ThreadLocal(BaseContext)才是正确的做法,因为每个请求都会经过拦截器,且拦截器在当前请求的线程中设置empId,后续的Controller和Service层都可以在同一个线程中获取到。
  • 而登录接口中设置的empId只对当前登录请求有效,对后续的修改密码请求无效。

因此,用户已经发现:在拦截器中设置BaseContext存储empId就能在修改密码请求中调用出来。所以需要调整代码,移除在登录接口中设置BaseContext的代码,只在拦截器中设置。

http://www.vanclimg.com/news/1424.html

相关文章:

  • ThreadLocal线程隔离值为NULL,直接复制使用封装类
  • 基于 Nacos + Higress 的 MCP 开发新范式,手把手教程来了!
  • 使用Vue.js实现动态表单字段
  • 特征 - kkksc03
  • 7月29日
  • 图神经网络的未来与挑战
  • 网站SSL证书怎么选?不用SSL证书会怎么样?
  • 安全可靠的PolarDB V2.0 (兼容MySQL)产品能力及应用场景 - 王权富贵
  • 2025牛客暑期多校训练营5_J
  • 【LeetCode 24】力扣算法:两两交换链表中的节点
  • Pwn2Own柏林2025:第三天赛事成果与技术漏洞全记录
  • POLIR-Laws-民事诉讼法:手机录音能否作为民事诉讼证据?怎么录音才能被法院采信?
  • MCP是如何工作的?
  • OBS
  • 屏幕翻译 安卓app
  • 微算法科技(NASDAQ:MLGO)应用区块链联邦学习(BlockFL)架构,实现数据的安全传输
  • 星球助手发布更新 v1.7.0
  • 使用Spring Cloud和Resilience4j实现微服务容错与降级 - spiderMan1
  • WinForm自定义控件实现类似百度网盘客户端菜单组件
  • 【比赛记录】2025CSP-S模拟赛29
  • 树形dp练习
  • python中 命令行参数解析模块 argparse
  • 基于YOLOv8的狗狗品种(多达60种常见犬类)品种鉴别识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
  • 公钥和私钥的部分作用
  • 使用 Kiro AI IDE 3小时实现全栈应用Admin系统
  • soildworks建模界面添加图片
  • 从0开始构建技术
  • Fastmcp 案例二(SSe)
  • Anaconda历史版本
  • 输入未知数目的数据