ThreadLocal

简介: ThreadLocal

只有利害关系和出众的才干,才能帮你出起主意来,才认真细到,眼光透彻。——巴尔扎克

我们在web开发中经常遇到在一个线程中需要共享变量

这里就可以使用ThreadLocal去完成

例如我们用户发起请求,我们在过滤器等将用户信息存储在ThreadLocal中,这样在代码中获取用户信息就相对容易

写法如下:

import cn.hutool.core.lang.Opt;
/**
 * 用户工具类
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/8/25 12:10
 */
public class UserUtils {
    private static final ThreadLocal<UserDetail> USER_THREAD = new ThreadLocal<>();
    /**
     * 设置当前用户
     *
     * @param userDetail 用户信息
     * @author <achao1441470436@gmail.com>
     * @since 2021/9/10 16:23
     */
    public static void setUser(UserDetail userDetail) {
        USER_THREAD.set(userDetail);
    }
    /**
     * 移除当前用户
     *
     * @author <achao1441470436@gmail.com>
     * @since 2021/10/22 16:49
     */
    public static void clear() {
        USER_THREAD.remove();
    }
    /**
     * 获取用户信息,有可能获取不到
     *
     * @return com.baomidou.shaun.core.profile.TokenProfile
     * @author <achao1441470436@gmail.com>
     * @since 2021/9/9 10:33
     */
    public static Opt<UserDetail> getUser() {
        return Opt.ofNullable(USER_THREAD.get()).or(() -> {
            // 这里UserDetail从实际登录框架调用对应api获取
            UserDetail userDetail = null;
            return Opt.of(userDetail);
        });
    }
}


在拦截器中:

package com.ruben.xchat.interceptor;
import com.ruben.xchat.utils.UserUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.AsyncHandlerInterceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 用户信息拦截器
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/22 19:19
 */
@Component
public class UserInfoInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        UserUtils.getUser().ifPresent(UserUtils::setUser);
        return true;
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        UserUtils.clear();
    }
}

然后别忘了让拦截器生效

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Resource
    private UserInfoInterceptor userInfoInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userInfoInterceptor).addPathPatterns("/**");
    }
}
相关文章
|
2月前
|
存储 Java
ThreadLocal 有什么用
ThreadLocal 有什么用
27 0
|
10月前
|
存储 Java
ThreadLocal
ThreadLocal字面意思本地线程,ThreadLocal使每个线程之间是隔离的,数据是独立的,我们使用过session都知道 session是一个会话,我们可以用它来存储一些用户的基本信息,这样每个用户在服务端都能取到,ThreadLocal也可以做到, ThreadLocal将相应的信息存储在当前的线程中,只有当前线程能够访问,其他线程不能访问,其实ThreadLocal 可以说是一个定制化的Map。
38 0
|
12月前
|
缓存 安全 Java
浅谈ThreadLocal
浅谈ThreadLocal
119 0
|
存储 SQL Java
ThreadLocal的其他应用
request对象跟PageHelper
87 0
|
存储 Java 数据库连接
对ThreadLocal的一点了解
ThreadLocal是线程变量,它为每个线程提供单独的存储空间。其主要作用是做线程间的数据隔离,也可以用于在同一个线程间方便地进行数据共享。(对于多线程资源共享,加锁机制采用“时间换空间”,ThreadLocal采用“空间换时间”)
108 0
|
存储 安全 Java
ThreadLocal 使用详解
ThreadLocal 是线程本地变量。当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程
487 0
|
存储 Java
ThreadLocal相关使用
ThreadLocal相关使用
173 0
ThreadLocal相关使用
|
存储 Java
对threadlocal了解多少?
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK 中提供的 ThreadLocal 类正是为了解决这样的问题。 ThreadLocal 类主要解决的就是让每个线程绑定自己的值,可以将 ThreadLocal 类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。
|
存储 缓存 算法
再聊聊ThreadLocal
只要线程处于活动状态并且 ThreadLocal 实例可访问,那么每个线程都持有对其线程局部变量(thread-local)副本的隐式引用。在线程消失后,它的所有线程局部变量(thread-local)副本都将被垃圾回收(除非存在对这些副本的其他引用)
再聊聊ThreadLocal