ThreadLocal原理及使用

一、ThreadLocal介绍

  • 使用场景:同一个线程共享数据。
  • ThreadLocal的作用:实现线程范围内的局部变量,即ThreadLocal在一个线程中是共享的,在不同线程之间是隔离的。
    原理:
    在这里插入图片描述
  • 原理:
    在这里插入图片描述
    使用场景:
    在这里插入图片描述
    ThreadLocal内存泄漏如何避免
    在这里插入图片描述
    在这里插入图片描述
    **注意:**调用remove方法的前提是知道是否使用完,即key值是否已经为空,那么就涉及到弱引用是否为空的判断,java9提供了方便的判断方式,如下图:
    在这里插入图片描述
  • 面试题:
    在这里插入图片描述

二、ThreadLocal使用

1、创建拦截器,在拦截器中创建一个ThreadLocal对象

package com.furenqiang.gulimall.auth.filiter;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class MyInterceptor implements HandlerInterceptor {


    public static ThreadLocal<Object> objectThreadLocal = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
}

2、配置mvc,使自定义拦截器生效

package com.furenqiang.gulimall.auth.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class AuthWebConfig implements WebMvcConfigurer {

   @Override
    public void addInterceptors(InterceptorRegistry registry){
        //添加拦截器并,作用范围为所有请求
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

3、存储数据,在任意地方都能使用

Object o = MyInterceptor.objectThreadLocal.get();
MyInterceptor.objectThreadLocal.set("yourEntity");

4、如果是异步编排异步执行的任务,线程不一样时,是不能共享ThreadLocal的信息的,所以得在异步编排之前的主线程取得需要的信息
在这里插入图片描述
如果要获取request,可使用下面代码:

ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();

5、案例二:threadlocal获取数据库连接
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值