一、背景(心急的同学可以直接看实现)
一天,小王正凝视着电脑屏幕沉浸在深思中,这时大林子手捧一杯水缓缓走近,见状便询问缘由。小王解释道,他正为前端每次传来的请求头中临时数据的处理感到困扰,这些数据不得不反复存入Redis中,之后再取出,流程繁琐。特别是考虑到同一账号下的连续请求可能携带不同的数据,这无疑增加了处理的复杂度。
大林子闻言,灵机一动建议道:“为何不尝试使用线程本地存储呢?我们可以在请求进入系统的那一刻,比如通过一个过滤器或是AOP切面,在处理逻辑开始前,先清空当前线程对应的本地存储区域,随后根据需求设置相应的参数。这样一来,后续处理流程中的各个方法就能够直接访问各自线程内的这个局部变量了,既简化了数据的存取流程,又避免了频繁的外部分布式存储交互,提升了效率。” 这番点拨,无疑为小王提供了一个高效且简洁的解决方案。
二、实现
1、本地线程自定义工具类
public class ThreadLocalUtil{
// 创建一个ThreadLocal实例,泛型指定为String
private static final ThreadLocal<String> threadLocalVariable = new ThreadLocal<>();
// 设置本地线程值
public static void setThreadLocalValue(String value) {
threadLocalVariable.set(value);
}
// 获取本地线程值
public static String getThreadLocalValue() {
return threadLocalVariable.get();
}
// 移除局部变量
public static void removeThreadLocalValue() {
threadLocalVariable.remove();
}
}
2、使用例子
public class ThreadLocalDemo {
public static void main(String[] args) {
// 设置主线程的ThreadLocal变量值
ThreadLocalUtil.setThreadLocalValue("Main thread value");
// 在主线程中获取并打印值
System.out.println("Main thread: " + ThreadLocalUtil.getThreadLocalValue());
// 创建新的线程
Thread thread = new Thread(() -> {
// 在新线程中设置ThreadLocal变量的值
ThreadLocalUtil.setThreadLocalValue("New thread value");
// 获取并打印新线程的值
System.out.println("New thread: " + ThreadLocalUtil.getThreadLocalValue());
});
// 启动新线程
thread.start();
// 在主线程再次打印值,验证值未被新线程修改
System.out.println("Main thread again: " + ThreadLocalUtil.getThreadLocalValue());
}
}
主线程和新线程各自设置和获取ThreadLocal
变量的值,且它们之间的值互不影响,体现了ThreadLocal
在处理线程间数据隔离方面的优势。