参考
线程封闭
线程封闭
把对象封装到一个线程里,只有这一个线程能看到这个对象(即使这个对象不是线程安全的也不会出现任何线程安全的问题了,因为只能在一个线程里访问)
实现线程封闭
- Ad-hoc 线程封闭:程序控制实现,最糟糕,忽略
- 堆栈封闭:局部变量,无并发问题(简单来说就是局部变量,比如多个线程访问一个方法,方法中的局部变量都会被拷贝到线程的栈中,所以局部变量不会被多个线程共享,也就不会出现并发问题,全局变量才容易出现问题)
- ThreadLocal 线程封闭:特别好的封闭方法(ThreadLocal内部维护了一个Map, Map的key是每个线程的名称,Map的值是要封闭的对象,每个线程的对象都对应了Map的值)
ThreadLocal 实例保存登录用户信息
public class RequestHolder {
private final static ThreadLocal<Long> requestHolder = new ThreadLocal<>();
/**
* 添加数据
* 在filter里将登录用户信息存入ThreadLocal
* 如果不使用ThreadLocal,我们会需要将request一直透传
* @param id
*/
public static void add(Long id){
// ThreadLocal 内部维护一个map,key为当前线程名,value为当前set的变量
requestHolder.set(id);
}
/**
* 获取数据
* @return
*/
public static Long getId(){
return requestHolder.get();
}
/**
* 移除变量信息
* 如果不移除,那么变量不会释放掉,会造成内存泄漏
* 在接口处理完以后进行处理(interceptor)
*/
public static void remove(){
requestHolder.remove();
}
}
网友评论