十五、ThreadLocal
ThreadLocal并不是一个Thread,,而是Thread的局部变量。
ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
场景:通过过滤器/过滤器获取到JWT ,可将JWT值存储到ThreadLocal中,当执行到需要JWT的地方是可以进行取出使用(当前线程内)。
主要用途
- 数据隔离:在多线程环境中,确保每个线程都有自己的变量副本,避免线程之间的数据干扰。
- 状态保持:在同一个线程的不同方法调用之间保持状态,而不需要通过参数传递。
- 资源管理:在每个线程中管理资源,如数据库连接、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