1.ThreadLocal的介绍
从Java官方文档中的描述:
ThreadLocal类用来提供线程内部的局部变量。这种变量子在多线程环境下访问(通过get和set方法)时能保证各个线程的变量相对独立于其他线程内的变量,ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。
我们可以得知的ThreadLocal的作用是:提供线程内的局部变量,不同的线程之间互不干扰,这种变量在线程的生命周期内起作用,减少一个线程内多个函数或组件之间一些公共变量传递的复杂度。
总结: ThreadLocal为每个线程提供单独一份存储空间,具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问。
特点:
- 线程并发;
- 传递数据;
- 线程隔离;
1.2基本使用
1.2.1常用方法
在使用之前,我们先认识几个ThreadLocal的常用方法
方法声明 | 描述 |
---|---|
ThreadLocal() | 创建ThreadLocal对象 |
public void set(T value) | 设置当前线程绑定的局部变量 |
public T get() | 获取当前线程绑定的局部变量 |
public void remove() | 移除当前线程的绑定局部变量 |
1.2.2使用场景
通常我们在需要利用全局变量来传递数据时就可以利用ThreadLocal来进行。比如:在后续请求中,前端一般会携带JWT令牌,通过JWT令牌可以解析出当前登录用户id,这时,我们可以将用户id存储在ThreadLocal中,在其他功能需要用到用户id时,就可以直接通过ThreadLocal来获取。
1.2.3使用
先用创建一个类对TreadLocal进行封装
public class BaseContext {
public static ThreadLocal<Long> threadLocal = new ThreadLocal<>();
public static void setCurrentId(Long id) {
threadLocal.set(id);
}
public static Long getCurrentId() {
return threadLocal.get();
}
public static void removeCurrentId() {
threadLocal.remove();
}
}
存放员工id
//设置当前登录用户id
BaseContext.setCurrentId(employee.getId());
使用id
//设置创建人id
em.setCreateUser(BaseContext.getCurrentId());
//设置更新人id
em.setUpdateUser(BaseContext.getCurrentId());
标签:局部变量,public,ThreadLocal,static,线程,id
From: https://blog.csdn.net/yrc1314/article/details/140928628