深入理解 ThreadLocal、InheritableThreadLocal 与 TransmittableThreadLocal
深入理解 ThreadLocal、InheritableThreadLocal 与 TransmittableThreadLocal
在多线程编程中,线程上下文传递是一个常见需求。Java 提供了几种机制来解决线程本地变量的传递问题,其中 ThreadLocal、InheritableThreadLocal 和 TransmittableThreadLocal 是常用的三种方案。本文将深入解析这三者的原理、差异及适用场景。
一、ThreadLocal:线程私有变量的基础实现
ThreadLocal 是 Java 核心库提供的线程本地变量工具类,它允许每个线程拥有变量的独立副本,避免多线程并发访问的线程安全问题。
核心原理
- 每个 Thread 类内部维护一个
ThreadLocalMap对象,用于存储线程本地变量 - ThreadLocal 本身不存储数据,仅作为 key 从 ThreadLocalMap 中获取线程私有值
- 数据存储结构:
Thread -> ThreadLocalMap -> Entry(ThreadLocal<?> k, Object v)
基本用法
ThreadLocal<String> threadLocal = new ThreadLocal<>();// 主线程设置值
threadLocal.set("main value");// 子线程获取值(将返回 null)
new Thread(() -> {System.out.println(threadLocal.get(