ThreadLocal 概述
-
ThreadLocal 不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式.
-
每个线程维护一个 ThreadLocalMap 的映射表,映射表的 key 是 ThreadLocal 实例本身, value 是要存储的副本变量.
-
ThreadLocal 实例本身并不存储值,它只是提供一个在当前线程中找到副本值的 key .每个线程中 ThreadLocalMap 变量可以有多个以 ThreadLocal 为key 存储的变量,比如 longLocal 和 stringLocal 等 key 存储不同的变量.
-
将一个共用的 ThreadLocal 静态实例作为 key , 将不同对象的引用保存到不同线程的 ThreadLocalMap 中,然后在线程执行的各处通过这个静态 ThreadLocal 实例的 get() 方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦.
get 函数源码分析
get 函数获取当前线程所对应的线程局部变量
public T get() {
Thread t = Thread.currentThread(); // ①
ThreadLocalMap map = getMap(t); // ②
if (map != null) {
// ③
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
// ④
@SuppressWarnings("unchecked")
T result = (