ThreadLocal

9次阅读

共计 1231 个字符,预计需要花费 4 分钟才能阅读完成。

ThreadLocal

直译为线程本地,个人理解为线程变量,意思是 ThreadLocal 中填充的变量属于当前线程,该变量对其他线程而言是隔离的。在多线程中,为保证多个线程对共享变量的安全访问,可以将变量放到 ThreadLocal 类型的对象中,使变量在每个线程中都有独立拷贝,不会出现一个线程读取变量时而被另一个线程修改的现象。

ThreadLocalMap

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;

ThreadLocal 的使用

通过 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 实现原理》

正文完
 0