ThreadLocal事实上是一个管理类,类似于一个系统,实例化之后的系统,可以给使用它的线程做一件事:
登记这个线程,并保存这个线程给的一个东西(对象)。当对应的线程来取东西时,把对应的东西还给线程。
为什么?先看实例,我们先创建两个threadLocal
,称之为余额系统
和欠款系统
。两个顾客(线程)再使用这个系统时,首先set,然后get。可以看到,两个顾客他们之后获取同一个ThreadLocal的本线程的值,都是自己对应的余额和欠款。这就说明了ThreadLocal
是一个系统,每个线程可以用它来记录自己的变量,并且是线程隔离的。
顾客1使用ThreadLocal:
顾客2使用ThreadLocal:
顾客一和顾客二启动,每次访问都是得到自己的对应值:
这里总结几点:
- ThreadLocal的实例通常设置为static,以便于使用。
- ThreadLocalD的一个实例可以提供一个容量给想使用它的线程。
- 每个线程的ThreadLocalMap有多个Entry(key-value),一个Entry就对应一个ThreadLocal的实例和本线程的值。有多个Entry,就对应多个ThreadLocal的实例和本线程的值。>
通俗一点,就是每个人有多家银行的银行卡(Entry),每张银行卡怎么使用呢?每张银行卡都有一个对应的银行系统(ThreadLocal)来管理。要想使用和获取某张卡,就得通过对应的银行管理。