直译为线程本地,个人理解为线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的。在多线程中,为保证多个线程对共享变量的安全访问,可以将变量放到ThreadLocal类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。
ThreadLocalMap 是 ThreadLocal 的静态内部类
ThreadLocalMap 维护了一个 Entry 数组,Entry 的 key 是 ThreadLocal 对象,value 是存入的对象,一个 ThreadLocal 只能存储一个Object对象,如果需要存储多个Object对象那么就需要多个ThreadLocal
Entry 的 key 引用 ThreadLocal 是弱引用
static class ThreadLocalMap { static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } } /** * The initial capacity -- MUST be a power of two. */ private static final int INITIAL_CAPACITY = 16; /** * The table, resized as necessary. * table.length MUST always be a power of two. */ private Entry[] table;
通过get、set来获取、设置存储对象,其中get方法会从当前线程中取出
ThreadLocalMap,也就是Thread中的threadLocals对象,然后把当前的ThreadLocal作为Key,ThreadLocal中的Object作为值存到线程的 threadLocals中去
ThreadLocal.ThreadLocalMap threadLocals = null;
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 = (T)e.value; return result; } } return setInitialValue(); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
参考资料: 《源码解读 | JDK源码 | ThreadLocal 实现原理》