ThreadLocal

ThreadLocal 是由 Java 标准库(JDK)提供的一个工具类。它的作用是为每个线程提供独立的变量副本,使得每个线程都可以独立地修改自己的变量副本,而不会影响到其他线程的变量副本。
ThreadLocal 主要通过一个 ThreadLocal 对象来实现,该对象可以存储任意类型的数据,并且对每个线程都提供一个独立的副本。当一个线程需要访问这个数据时,它会先获取自己的副本,然后在副本上进行操作。这样,即使多个线程同时访问同一个 ThreadLocal 对象,它们也不会互相影响,从而实现了线程间的隔离。
ThreadLocal 的使用非常广泛,特别是在多线程程序中。例如,在 Web 应用程序中,每个请求都会被分配给一个独立的线程来处理,而这些线程之间需要访问共享资源,例如数据库连接、缓存等。使用 ThreadLocal 可以很方便地为每个线程分配一个独立的资源副本,避免了线程间的竞争和同步问题,从而提高了系统的并发性能。
需要注意的是,ThreadLocal 仅仅提供了线程间的隔离,但并不保证线程安全。如果多个线程同时访问同一个可变对象,仍然需要采取其他措施来保证线程安全,例如使用锁或者原子变量等。

种类

在 Java 中,ThreadLocal 主要有两种类型,分别是:
  1. ThreadLocal 类型:这是最常用的类型,它可以存储任意类型的数据,并且对每个线程都提供一个独立的副本。例如:
    1. InheritableThreadLocal 类型:这是 ThreadLocal 的一个子类,它可以让子线程继承父线程的副本。例如:
      需要注意的是,因为 ThreadLocal 和 InheritableThreadLocal 都是泛型类,所以在使用时需要指定泛型参数的类型。同时,由于 ThreadLocal 可能会引发内存泄漏问题,因此在使用时需要格外注意,及时清理不再使用的线程副本。
      另外,Java 8 中还引入了 ThreadLocalRandom 类,它是一个随机数生成器,每个线程都有自己的种子,可以在多线程环境下生成独立的随机数。这个类虽然也包含 "ThreadLocal" 字样,但它并不是 ThreadLocal 的子类,与 ThreadLocal 类型没有直接关系。

      Transmittable Thread Local

      TransmittableThreadLocal 是阿里巴巴开源的一个 Java 工具类库,它是 ThreadLocal 的一个增强版本,可以在线程池等场景下,自动传递线程变量。

      内存泄漏

      虽然 TransmittableThreadLocal 库解决了线程变量在线程池场景下的传递问题,但它也可能会引发内存泄漏问题,需要特别注意。
      在使用 TransmittableThreadLocal 时,如果不及时清理线程变量,就可能会导致内存泄漏。具体来说,由于 TransmittableThreadLocal 在存储线程变量时使用了一个特殊的容器,如果线程池中的某个任务一直持有容器中的线程变量,并且不释放,那么这个线程变量会一直存在,从而导致内存泄漏。
      为了解决这个问题,TransmittableThreadLocal 提供了 remove() 方法,可以手动清理线程变量。一般情况下,应该在任务执行完毕后,显式调用 remove() 方法来清理线程变量。例如:
       
      Loading...
      目录
      文章列表
      王小扬博客
      产品
      Think
      Git
      软件开发
      计算机网络
      CI
      DB
      设计
      缓存
      Docker
      Node
      操作系统
      Java
      大前端
      Nestjs
      其他
      PHP