Java 线程之 ThreadLocal 应用

1. ThreadLocal

  • 普通的静态变量是所有线程共享的,ThreadLocal 可让每个线程创建自己的本地变量
  • ThreadLocal 为每一个线程都提供一个变量副本,隔离多个线程对数据的数据共享

2. 实战

  • 注:ThreadLocal不可以使用原子类型,只能使用Object类型

2.1 父子线程变量继承:ThreadLocal 与 InheritableThreadLocal

@Slf4j
public class Demo {
    // 案例一:ThreadLocal 不支持继承
    // 16:22:57.889 [main] - Hello
    // 16:22:57.889 [Thread-1] - null 子线程获取不到父线程的本地变量
    // public static ThreadLocal threadLocal = new ThreadLocal<>();

    // 案例二:InheritableThreadLocal 应用场景:获取用户登陆信息
    // 16:39:13.397 [Thread-1] - Hello
    // 16:39:13.397 [main] - Hello
    public static ThreadLocal threadLocal = new InheritableThreadLocal<>();

    @Test
    public void threadLocalDemo() {
        threadLocal.set("Hello");

        new Thread(() -> {
            log.info(threadLocal.get());
        }).start();

        log.info(threadLocal.get());
    }
}

3. 应用场景

3.1 应用

Spring 事务处理使用 ThreadLocal

3.2 ThreadLocal 慎用场景

场景一:线程池里线程调用 ThreadLocal,
线程池的线程都是复用的,在线程池中线程非常难结束甚至于永远不会结束,线程持续的时间将不可预测

场景二:异步程序中使用ThreadLocal
因为线程将请求发送后,不会等待远程返回结果,而是继续向下运行,真正的返回结果得到后,处理的线程可能是其他的线程

版权声明:
作者:倾城
链接:https://www.techfm.club/p/46406.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>