springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化
一句话本质
为每个线程创建独立的变量副本,实现多线程环境下数据的安全隔离(线程操作自己的副本,互不影响)。
关键解读:
-
核心机制
• 同一个ThreadLocal
对象(如示意图中的红色区域tl
)被多个线程共享。• 每个线程调用
set()
/get()
时,实际访问的是自己线程的专属存储空间(如图中的蓝色和绿色区域)。• 例如:线程1设置
"萧炎"
,线程2设置"药尘"
,但各自get()
时互不干扰。 -
线程安全的根源
• 数据不共享:每个线程的变量副本独立存储(如ThreadLocal
内部通过ThreadLocalMap
实现线程隔离)。• 无需加锁:天然规避多线程竞争,性能更高。
-
典型应用场景
• 数据库连接(每个线程独立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进行释放