是什么?

ThreadLocal事实上是一个管理类,类似于一个系统,实例化之后的系统,可以给使用它的线程做一件事:

登记这个线程,并保存这个线程给的一个东西(对象)。当对应的线程来取东西时,把对应的东西还给线程。

为什么?

先看实例,我们先创建两个threadLocal,称之为余额系统欠款系统。两个顾客(线程)再使用这个系统时,首先set,然后get。可以看到,两个顾客他们之后获取同一个ThreadLocal的本线程的值,都是自己对应的余额和欠款。这就说明了ThreadLocal是一个系统,每个线程可以用它来记录自己的变量,并且是线程隔离的。

顾客1使用ThreadLocal:
ThreadLocal的原理和使用场景_实例化

顾客2使用ThreadLocal:
ThreadLocal的原理和使用场景_其他_02

顾客一和顾客二启动,每次访问都是得到自己的对应值:
ThreadLocal的原理和使用场景_实例化_03

ThreadLocal的原理和使用场景_实例化_04

怎么用

这里总结几点:

  • ThreadLocal的实例通常设置为static,以便于使用。
  • ThreadLocalD的一个实例可以提供一个容量给想使用它的线程。
  • 每个线程的ThreadLocalMap有多个Entry(key-value),一个Entry就对应一个ThreadLocal的实例和本线程的值。有多个Entry,就对应多个ThreadLocal的实例和本线程的值。>
    通俗一点,就是每个人有多家银行的银行卡(Entry),每张银行卡怎么使用呢?每张银行卡都有一个对应的银行系统(ThreadLocal)来管理。要想使用和获取某张卡,就得通过对应的银行管理。