# ThreadLocal 用法总结

### 什么是ThreadLocal?&#x20;

ThreadLocal 是一个特殊的类, 可以把其他变量装进这个类中,  使得 这个类可以在下面两个场景中使用:&#x20;

1. 线程隔离, 给每个线程都分配一个独立的对象, 避免多个线程之间对资源进行抢占
2. 在每个线程或者类内都需要保存的 全局变量， 可以用 ThreadLocal, 避免传递参数

### ThreadLocal 对象的初始化

ThreadLocal 变量有两种初始化方法:

1. 在 ThreadLocal 对变量进行"装载"时重写 initialValue() 方法. 这种方法适合于上面说的第一个场景. 因为我们一开始就知道ThreadLocal 变量的初始值是什么(比如例子中的 SimpleDateFormat("yyyy-MM-dd hh:mm:ss") ), 我们只需要对他进行"复印"多几份.
2. 调用 ThreadLocal 对象.set() 方法, 将变量"装载"进 ThreadLocal对象 里. 这种方法适用于上面所说的第二个场景. 因为我们并不清楚 ThreadLoca 变量需要初始化成怎样, 需要手动地进行赋值. 这个赋值可能需要其他类传进来, 可能需要在控制台输入.

### ThreadLocal 对象的获取

想要获取 ThreadLocal 对象, 必须先对其进行初始化, 初始化以后调用 ThreadLocal.get() 获取 ThreadLocal 对象内部"装载"的对象.

### ThreadLocal 与线程的关系

每一个线程都有一个ThreadLocalMap. 这个Map 和 HashMap 类似, 也是以一个个 Entry(也就是键值对) 的方式存在, 键为 ThreadLocal 对象, 值为 ThreadLocal 对象中"装载"的 对象.

### ThreadLocal 的释放

ThreadLocal 对象不再使用后, 必须调用 ThreadLocal对象.remove() 方法对ThreadLocalMap中对应的 键值对进行删除.
