ThreadLocal 场景题

编程入门 行业动态 更新时间:2024-10-09 12:32:33

ThreadLocal <a href=https://www.elefans.com/category/jswz/34/1770727.html style=场景题"/>

ThreadLocal 场景题

面试中谈起并发,ThreadLocal 必定要聊。ThreadLocal 的线程隔离非常好用。

几个经典且实用的场景,防止在面试官前一时语塞

文章目录

    • 1. 用过ThreadLocal吗?
    • 2. 它有什么用?
    • 3. 什么场景下使用的?
        • 场景一、保存用户信息
          • 场景:
          • 1,定义用户实体:
          • 2,定义工具类操作ThreadLocal(存放,获取,删除用户信息)
          • 3,拦截器:1,访问接口时将用户信息放入ThreadLocal,2,访问结束时候删除ThreadLocal中信息(线程放入线程池并不一定会销毁)
          • 4,配置拦截器。
          • 5,定义用户信息具体操作接口:
          • 6,使用:(代码中第二种使用方法,不需要定义接口)
    • 4. 源码深入

1. 用过ThreadLocal吗?

2. 它有什么用?

3. 什么场景下使用的?

场景一、保存用户信息

当我们的系统项目足够大到一定程度时,一些基础功能模块被调用很多次也会随之增大。

例如用户模块,几乎每个系统的每个功能都是和用户绑定的,用户在访问某个功能时,总是需要判断用户的一些属性判断对应是否拥有对应权限。

如果每个功能都查询一遍用户及相关信息,那代码就过于臃肿且不利于维护。

场景:

接手一个项目,用户信息是用Feign调用用户中心获取,方法之间相互调用使用用户信息很麻烦(1,通过接口传参,2,再次调用Feign)。所以使用ThreadLocal存放用户信息。(大多公司都会把自己的用户单独放到公司层面做一套服务,供各个业务线使用)

1,定义用户实体:
@ApiModel("登录用户信息")
@Data
public class FeginUser implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "用户ID")private String id;@ApiModelProperty(value = "用户名")private String name;@ApiModelProperty(value = "密码")@JsonIgnoreprivate String upass;
}
2,定义工具类操作ThreadLocal(存放,获取,删除用户信息)
  public class ThreadLocalUtil {/*** 保存用户对象的ThreadLocal  在拦截器操作 添加、删除相关用户数据*/private static final ThreadLocal<FeginUser> userThreadLocal = new ThreadLocal<FeginUser>();/*** 添加当前登录用户方法  在拦截器方法执行前调用设置获取用户* @param user*/public static void addCurrentUser(FeginUser user){userThreadLocal.set(user);}/*** 获取当前登录用户方法*/public static FeginUser getCurrentUser(){return userThreadLocal.get();}/*** 删除当前登录用户方法  在拦截器方法执行后 移除当前用户对象*/public static void remove(){userThreadLocal.remove();}}
3,拦截器:1,访问接口时将用户信息放入ThreadLocal,2,访问结束时候删除ThreadLocal中信息(线程放入线程池并不一定会销毁)
@Component
@Slf4j
public class UserInfoInterceptor implements HandlerInterceptor  {@Autowiredprivate UserInfoUtil userInfoUtil;/*** 请求执行前执行的,将用户信息放入ThreadLocal* @param request* @param response* @param handler* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {FeginUser user;try{user = userInfoUtil.getUser();}catch (CustomException e){log.info("***************************用户未登录, ThreadLocal无信息***************************");return true;}if (null!=user) {log.info("***************************用户已登录,用户信息放入ThreadLocal***************************");ThreadLocalUtil.addCurrentUser(user);return true;}log.info("***************************用户未登录, ThreadLocal无信息***************************");return true;}/*** 接口访问结束后,从ThreadLocal中删除用户信息* @param request* @param response* @param handler* @param ex* @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info("***************************接口调用结束, 从ThreadLocal删除用户信息***************************");ThreadLocalUtil.remove();}
4,配置拦截器。
@Configuration
@ComponentScan
public class MyAppConfigurer extends WebMvcConfigurationSupport {@Autowiredprivate UserInfoInterceptor userInfoInterceptor;/*** 拦截器,将用户信息放入threadLocal** @param registry*/@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(this.userInfoInterceptor).addPathPatterns("/**");super.addInterceptors(registry);}}
5,定义用户信息具体操作接口:

为了类实现接口后直接使用(不定义为基础类,是因为类单继承)

public interface IBaseUserInfo {default Boolean isLogin() {return ThreadLocalUtil.getCurrentUser() != null;}default FeginUser getUser() {return ThreadLocalUtil.getCurrentUser();}default String getUserId() {if (ThreadLocalUtil.getCurrentUser() != null) {return ThreadLocalUtil.getCurrentUser().getId();}return null;}}
6,使用:(代码中第二种使用方法,不需要定义接口)
@Service
public class ApplylServiceImpl implements IBaseUserInfo {public void applyUserInfo() {/*** 1,实现接口后,直接使用*/FeginUser user1 = getUser();/*** 2,不实现接口,调用ThreadLocalUtil*/FeginUser user2 = ThreadLocalUtil.getCurrentUser();}}

4. 源码深入

更多推荐

ThreadLocal 场景题

本文发布于:2024-02-05 17:00:01,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1745469.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:场景   ThreadLocal

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!