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();
    }

}
原文地址:https://www.cnblogs.com/zpKang/p/13553242.html