ThreadLocal
ThreadLocal
ThreadLocal 是 jdk1.8及之后版本的API
从名字我们就可以看到ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
对象创建
格式:
private static ThreadLocal<User> threadLocal = new ThreadLocal<>();
创建此对象需要一个泛型, 来指定ThreadLocal可以存储的数据, 如果需要存储多个数据, 泛型变量可以使用Map类型
核心方法
返回值 | 方法 | 说明 |
---|---|---|
void | set(T value) |
存入数据 |
T | get() |
获取数据 |
void | remove() |
清除数据 |
实际应用
例如在springboott的同一次请求中, 使用同一个ThreadLocal对象在Controller中set一个数据, 可以在service中获取到这个数据
封装工具类
单个对象
例如只能存User对象
public class UserThreadLocal {
// 1. 定义本地线程对象
private static ThreadLocal<User> threadLocal = new ThreadLocal<>();
// 2. 定义数据新增的方法
public static void set(User user) {
threadLocal.set(user);
}
// 3. 获取数据
public static User get() {
return threadLocal.get();
}
// 4. 移除方法 使用threadLocal时切记将数据移除,
// 否则极端条件下, 容易产生内存泄露的风险
public static void remove() {
threadLocal.remove();
}
}
多个对象
使用map存储多个数据
public class ThreadLocalUtil {
private static ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
static {
threadLocal.set(new HashMap<String, Object>());
}
public static void set(String key, Object value) {
threadLocal.get().put(key, value);
}
public static Object get(String key) {
return threadLocal.get().get(key);
}
public static void remove() {
threadLocal.remove();
}
}