欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化

springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化

2025/9/10 19:27:47 来源:https://blog.csdn.net/qq_44721704/article/details/147851933  浏览:    关键词:springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化

一句话本质
为每个线程创建独立的变量副本,实现多线程环境下数据的安全隔离(线程操作自己的副本,互不影响)。


关键解读:

  1. 核心机制
    • 同一个 ThreadLocal 对象(如示意图中的红色区域 tl)被多个线程共享。

    • 每个线程调用 set()/get() 时,实际访问的是自己线程的专属存储空间(如图中的蓝色和绿色区域)。

    • 例如:线程1设置 "萧炎",线程2设置 "药尘",但各自 get() 时互不干扰。

  2. 线程安全的根源
    • 数据不共享:每个线程的变量副本独立存储(如 ThreadLocal 内部通过 ThreadLocalMap 实现线程隔离)。

    • 无需加锁:天然规避多线程竞争,性能更高。

  3. 典型应用场景
    • 数据库连接(每个线程独立 Connection

    • 用户会话信息透传(如身份信息跨方法传递)

    • 非线程安全工具类(如 SimpleDateFormat 的线程隔离使用)


图片中的直接印证:
• 两个线程操作同一个 tl(红色区域),但分别 set("萧炎")set("药尘")

• 多次 tl.get() 始终返回自己线程设置的值,直观体现了“变量副本隔离”的特性。


总结:
ThreadLocal = 线程专属储物柜
• 全局只有一个柜子管理员(ThreadLocal 对象)

• 但每个线程(人)有自己的独立储物格(变量副本)

• 存/取数据时,自动匹配当前线程的储物格,绝对安全,永不串用。

在这里插入图片描述

在这里插入图片描述
所以我们对代码进行修改
创建一个工具类ThreadLocalUtil
代码如下:

package com.itheima.utils;import java.util.HashMap;
import java.util.Map;/*** ThreadLocal 工具类*/
@SuppressWarnings("all")
public class ThreadLocalUtil {//提供ThreadLocal对象,private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();//根据键获取值public static <T> T get(){return (T) THREAD_LOCAL.get();}//存储键值对public static void set(Object value){THREAD_LOCAL.set(value);}//清除ThreadLocal 防止内存泄漏public static void remove(){THREAD_LOCAL.remove();}
}

在拦截器中修改代码增加把业务数据存储到threadLocal中

在这里插入图片描述

然后在usercontroller中对代码进行修改,重新获取username对象
在这里插入图片描述

最后不要忘记在拦截器调用remove进行释放

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词