深入理解ThreadLocal看这篇就够了-应用场景、内部原理、内存泄漏以及父子线程如何共享数据

本文深入探讨ThreadLocal,包括其概念、应用场景、内部原理、内存泄漏问题以及如何在父子线程间共享数据。通过实例分析,阐述了ThreadLocal如何在并发编程中解决线程安全问题,并提醒开发者注意避免内存泄漏。
摘要由CSDN通过智能技术生成

为了帮助大家在项目中更好使用ThreadLocal,本文向大家介绍ThreadLocal原理和常见问题,具体内容如下:

  1. ThreadLocal是什么

  1. ThreadLocal的应用场景

  1. ThreadLocal的内部原理

  1. ThreadLocal内存泄露问题

  1. 父子线程如何共享数据


ThreadLocal是什么

java.lang.ThreadLocal是JDK中提供的一个类,在并发编程中,为解决线程安全问题提供了一种用空间换时间的新思路。

在一些高并发的场景中,如果需要对公共资源进行操作,我们第一时间就会想到使用synchronized或Lock,给访问公共资源的代码上锁,来保证了代码的原子性。但是多个线程同时竞争同一把锁的时候,可能会造成大量的锁等待,可能会浪费很多时间,让系统的响应时间变慢。这个时候我们就可以考虑是否可以使用ThreadLocal。

将类变量放到ThreadLocal类型的对象中,就可以使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。


ThreadLocal的应用场景

1、全局存储用户信息

当用户登陆后,会将用户信息存入token中并返回给前端,当用户调用需要授权的接口时,前端会把token放到header中去请求后端接口,后端在拦截器中解析token,获取用户信息,然后存放到某个工具类的ThreadLocal变量中,后续执行代码过程中,就不需要关注如何获取用户信息,只需要使用工具类get方法就可以获取。

2、SimpleDateFormat与ThreadLocal结合使用

大家都知道SimpleDateFormat是不安全类,但是做一些日期处理的时候又经常会用到这个类,这个时候我们可以与ThreadLocal结合进行使用,从而避免了线程安全问题。

// 这样来申明全局变量

public final static ThreadLocal<SimpleDateFormat> DF = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd"));

3、org.slf4j.MDC处理链路追踪ID

MDC类本身包含了一个MDCAdapter对象,此对象里又包含了一个ThreadLocal的全局变量,可以用来处理日志相关的信息。例如常见的我们处理traceId的时候,先在过滤器里生成traceId并放入MDC,然后在日志文件里配置traceId,这样我们打印日志的时候就可以看到traceId了。

@Override

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

// 此处生成traceId...

// 将traceId放入MDC

MDC.put("traceId", traceId);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值