Java ThreadLocal

前言

ThreadLcoal提供了一种实现去让线程创建内部变量,而与其他线程隔离开来,这也是保证线程安全的方法之一。
想要实现这种功能,我们很自然会想到让ThreadLocal去维护一个HashMap,其中key是Thread对象,value是变量值。

但是ThreadLocal并没有这样做,而是每个线程维护一个ThreadLcoalMap,key是ThreadLocal对象,value是变量值。这样做的好处又是什么呢?

源码分析

set(T value)

public void set(T value) {
        //先获取当前线程
        Thread t = Thread.currentThread();
        //获取线程内部维护的一个哈希表
        ThreadLocal.ThreadLocalMap map = getMap(t);
        if (map != null)
            //如果存在,赋值
            map.set(this, value);
        else
            //不存在,先创建再赋值
            createMap(t, value);
    }

get()

public T get() {
        //获取当前线程
        Thread t = Thread.currentThread();
        //获取线程内部维护的一个哈希表
        ThreadLocal.ThreadLocalMap map = getMap(t);
        if (map != null) {
            //从哈希表获取当前线程的内部变量,这里的this是ThreadLocal对象
            ThreadLocal.ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        //设置初始化值,默认为null,可以重写setInitialValue()方法
        return setInitialValue();
    }

你可能感兴趣的:(Java ThreadLocal)