线程变量ThreadLocal的使用

Posted 人在江湖飘AOE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程变量ThreadLocal的使用相关的知识,希望对你有一定的参考价值。

我们有时候会通过token进行多次查询(猪:token是redis中的key),比如:

一次是在登录拦截器中,一次是在controller的业务中查询,这样存在性能和资源的浪费问题!!!

那么如何将拦截器中的数据传递到Controller中呢?

有两种方案:

    1,将User对象放置到request对象中

    2,使用ThreadLocal线程变量实现(在进入tomcat和产生响应前,对象都处于同一个线程中)

实现:

1,定义一个ThreadLocal相关的类


public class UserThreadLocal {
private static ThreadLocal<User> USER_LOCAL = new ThreadLocal<>();

  //对外提供set和get方法
  public static void setUser(User user){
    USER_LOCAL.set(user);
  }
  public static User getUser(){
    return USER_LOCAL.get();
  }
}

2,在登陆拦截器中将User对象放置到ThreadLocal中

  //查询到用户,将用户放入到ThreadLocal中
  UserThreadLocal.setUser(user);

3,在Service中可以通过ThreadLocal获取User  

  //从ThreadLocal线程变量中获取User对象
  User user = UserThreadLocal.getUser();

 

以上是关于线程变量ThreadLocal的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java中线程局部变量ThreadLocal使用教程及源码分析

python 线程中的局部变量ThreadLocal

线程局部变量ThreadLocal实现原理

Java并发编程原理与实战二十五:ThreadLocal线程局部变量的使用和原理

Java ThreadLocal

父子线程和线程池如何实现threadLocal变量传递