ThreadLocal不同类型tl itl ttl

发布时间 2023-03-22 21:11:12作者: Katsu
  1. ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal的使用场景和实现原理
类型 使用场景 实现原理
ThreadLocal 解决多线程共享变量问题,为每个线程创建一个变量副本

使用ThreadLocalMap<ThreadLocal, Object>存储线程和value的映射关系,ThreadLocalMap是Thread类的成员变量

  • 同时 Entry 继承了WeakReference<ThreadLocal<?>,当没有强引用指向 ThreadLocal 对象时,key 会被回收;
  • value 可能不会被及时回收,因为ThreadLocalMap.Entry对象还在强引用value,导致value无法被回收,从而产生内存泄露,因此使用完之后最好主动进行 remove 操作;但ThreadLocal做了如下优化,防止value发生内存泄漏:
    • 调用set()方法时,采样清理、全量清理,扩容时还会继续检查。
    • 调用get()方法,没有直接命中,向后环形查找时
    • 调用remove()时,除了清理当前Entry,还会向后继续清理。
InheritableThreadLocal 解决父子线程变量副本传递的问题

Thread 中除 threadLocals 属性外,还有一个 inheritableThreadLocals 属性,其类型也是 ThreadLocalMap,在Thread的init()方法中进行赋值

 

这就解释了为什么InheritableThreadLocal为什么在线程池中用不了(init 方法只会在线程创建时被执行一次)。 

注意:拷贝父类的inheritableThreadLocal到子类中属于浅拷贝(如果在子类中改动,之后在父类中也能获取到最新值)

TransmittableThreadLocal 解决线程池的线程复用导致的变量副本问题
  • TransmittableThreadLocal 继承 InheritableThreadLocal;
  • 有一个InheritableThreadLocal<WeakHashMap<TransmittableThreadLocal<Object>, ?>>类型的holder成员变量
  • 且在get、set、remove时都会同步更新holder

  •  

     参照:https://www.cnblogs.com/sglx/p/16018266.html