前言
本文主要是用实际案例比较下ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal 使用方式,三者区别以及原理简单介绍,避免同学们在实际开发中踩坑。
ThreadLocal
ThreadLocal 每个线程可以拥有自己线程的变量实例,可以从隔离的角度解决变量线程安全的问题。
使用场景
- 通常用于保存线程不安全的工具类,典型的需要使用的类就是 SimpleDateFormat。
- 每个线程内需要保存类似于全局变量的信息(例如在拦截器中获取的用户信息),保存一些业务内容(用户权限信息、从用户系统获取到的用户名、用户ID 等),这些信息在同一个线程内相同,但是不同的线程使用的业务内容是不相同的。
- 线程级别缓存,常用于数据量比较大的缓存数据,但每个线程数据不一样 又要避免被全局共享。
- 链路追踪,统计全链路耗时(常用的全链路分析框架 如鹰眼 zipkin底层原理就是这个)
使用以及出现的问题
例1
注意箭标位置
输出结果 ,没有任何问题!!!
例2
此时我把箭头代码,移到主线程上 看看会发生什么
源码如下:
public class MyTest {
static ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void main(String[] args) {
threadLocal.set("abc");
MyThread myThread = new MyThread();
Thread t = new Thread(myThread);
t.setName("ThreadLocal-Test");
t.start();
}
static class MyThread implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " "