ThreadLocal的原理和使用场景

是什么?

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

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

为什么?

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

顾客1使用ThreadLocal:
image

顾客2使用ThreadLocal:
image

顾客一和顾客二启动,每次访问都是得到自己的对应值:
image

image

怎么用

这里总结几点:

  • ThreadLocal的实例通常设置为static,以便于使用。还可以将ThreadLocal封装为工具类。
  • ThreadLocalD的一个实例可以提供一个容量给想使用它的线程。ThreadLocal里放一个map,这样就可以用一个ThreadLocal放任何信息了
  • 每个线程都自带了一个ThreadLocalMap,有多个Entry(key-value),一个Entry就对应一个ThreadLocal的实例和本线程的值。有多个Entry,就对应多个ThreadLocal的实例和本线程的值。>
    通俗一点,就是每个人有多家银行的银行卡(Entry),每张银行卡怎么使用呢?每张银行卡都有一个对应的银行系统(ThreadLocal)来管理。要想使用和获取某张卡,就得通过对应的银行管理。
    image
posted @ 2021-08-29 22:28  快乐的海盗  阅读(255)  评论(0编辑  收藏  举报