Android开发-ThreadLocal用法和源码

ThreadLocal的简单用法
这里写图片描述

ThreadLocal源码解析:

// ThreadLocal的get方法
public T get() {
        // 首先获取相当线程,因此不管ThreadLocal对象是在哪个线程new的,
        // 调用get方法是,获取的都是当前线程保存的值
        Thread t = Thread.currentThread();
        // 获取当前线程Thread对象的ThreadLocalMap成员变量,是一个Map对象,线程局部变量就保存在这个Map中
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            // 如果已经保存过局部变量了,e!=null,直接return
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;  
            }
        }
        // 没有存储过局部变量,调用initialValue返回一个默认值
        return setInitialValue();
    }

    // getMap方法只是返回Thread对象的threadLocals变量,默认等于null
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }

// setInitialValue方法内部调用initValue方法,就是我们上面重写的方法
private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        // 如果map不等于null,将默认值保存在map中
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);  // 否则创建map
        return value;
    }

// 创建map,并且保存初始值
void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

// set方法
public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        // 如果map不等于null,重设value值
        if (map != null)
            map.set(this, value); // map的key值是ThreadLocal对象
        else
            createMap(t, value);  // 否则创建map
    }

猜你喜欢

转载自blog.csdn.net/qq_19694479/article/details/80950604