ThreadLocal项目中实际应用场景以及ThreadLocal使用的时候应注意的问题 (主线程ThreadLocal中的数据怎么能在子线程中也能获取)

发布于:2022-12-31 ⋅ 阅读:(300) ⋅ 点赞:(0)

无论锁岁月如何请记住:these are the nights that never die **《The Nights》**当然励志的同时作为一名劳动人民,永远不要忘了时刻的提升自己的技能,让自己立于不败之地,否则落后就要挨打。
当你写代码的时候,你需要在线程中任意的位置获取一个变量的时候怎么办呢,采用方法参数传递的方式吗?当然可以了,就是麻烦点,有没有更好的方案额?当然有使用ThreadLocal啦 。。。这里我来给大家讲解一种ThreadLocal在项目中的使用场景 希望可以帮到大家

大家请看类似下边的场景,这时候怎么办呢? 在这里插入图片描述
当然了主角就是ThreadLocal了当然是使用ThreadLocal了,请看下边的贴图,我们为了方便使用定义一个如下的工具类
在这里插入图片描述
接下来看看怎么在方法中使用

在这里插入图片描述
通过上述的方式只要是在同一个线程中,只要你存储到Thread中那么你在任何位置都可以获取到 你存储的数据

但是大家细想一下,假如有这么一个场景,你在一个线程中又启用了子线程,比如比如你使用了线程池,或者是自己new创建了新的线程,那么在这先线程中,还能够获取到通过ThreadLocal存储的数据吗?答案是不能的(感兴趣的同学可以自己试验一下,我这里就不做这个试验了,直接上干货 怎么办呢

答案揭晓,
这里分为两种情况:
第一:如果是通过new Thread的方式创建的线程
可以使用 InheritableThreadLocal 代替ThreadLocal,InheritableThreadLocal是ThreadLocal的子类,它增加的功能就是可以继承父线程上绑定的数据,那么Thread的源码是怎么实现的呢?
在这里插入图片描述
第二:如果是使用的线程池的话上述方法就不可靠了,为什么呢,因为第一种方式获取父线程中的数据是在线程初始化的时候 去触发获取的,而线程池中的线程是实现初始化好的所以就不好用了
不过 可以通过阿里开源组件transmittable-thread-local解决
引入依赖(版本根据自己的需要去选取)

com.alibaba
transmittable-thread-local
2.13.2

经过上述的分析我们的工具类如下图所示
在这里插入图片描述
测试使用详情
在普通的线程获取
在这里插入图片描述
在线程池中的线程里获取
在这里插入图片描述
好了,至此关于 ThreadLocal的在项目中的使用介绍完毕,当然了,使用的场景还有很多比如你可以在你的项目中使用ThreadLocal传递权限信息,token信息等等都是可以的。

各位看懂了吗?有所收获就点个赞收藏吧 ^ ^

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到