ThreadLocal

发布时间 2023-08-28 22:15:22作者: KLAPT

ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。

  • 因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。
  • 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题

Threadlocl是作为当前线程中属性ThreadLocalMap集合中的某一个Entry的key值Entry(threadlocl,value),虽然不同的线程之间threadlocal这个key值是一样,但是不同的线程所拥有的ThreadLocalMap是独一无二的,也就是不同的线程间同一个ThreadLocal(key)对应存储的值(value)不一样,从而到达了线程间变量隔离的目的,但是在同一个线程中这个value变量地址是一样的。

  Thread类中有一个变量 threadLocals ,它是ThreadLocal内部类ThreadLocalMap类型的变量

只有当线程第一次调用ThreadLocal的set或者get方法的时候,才会创建他们。另外,其实每个线程的本地变量不是存放在ThreadLocal实例中的,而是存储在了对应线程的 threadLocals 变量里面(前面也说过,该变量是Thread类的变量)。也就是说,ThreadLocal类型的线程本地变量是存放在具体的线程空间上的,ThreadLocal本身相当于一个装载本地变量的工具壳,通过set方法将value添加到调用线程的threadLocals中,当调用线程调用get方法时候能够从它的threadLocals中取出变量。如果调用线程一直不终止,那么这个本地变量将会一直存放在他的threadLocals中, 就可能会导致内存溢出,因此使用完后需要将其remove掉,调用remove方法,将threadLocals中的本地变量删除。