ThreadLocal源码解析

1.概述

多线程并发时用于存储当前线程的本地变量副本。

2. ThreadLocal解析

public void set(T value)
public T get()
public void remove()
private T setInitialValue() 

set:用于存储当前线程的副本变量值
get:获取当前线程的副本变量值
remove:移除ThreadLocalMap中当前线程的副本变量值
setInitialValue:初始化当前线程的副本变量值
具体看源码实现:

set方法

public void set(T value) {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
    }

 ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

1.获取当前线程
2.去ThreadLocalMap中去取map
3.当map不为空时就将当前副本值和ThreadLocal存入map中
4.当map为空时创建一个ThreadLocalMap,并将当前副本值和ThreadLocal存入map中。

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 = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

1.获取当前线程。
2.ThreadLocalMap中是否存有当前的线程副本。
3.当map非空时,从ThreadLocalMap中取出Entry,Entry其实就是table数组。然后获取当前ThreadLocal对应的value。
4.初始化一个本地副本变量。

remove方法

public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null)
             m.remove(this);
     }

remove方法很简单
1.从ThreadLocalMap中获取当前线程的map。
2.非空就remove掉,为空什么都不做。

setInitialValue方法

private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

protected T initialValue() {
        return null;
    }

void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

get方法中会调用到setInitialValue方法。
1.initialValue初始化变量值为protected方法,为子类实现。
2.从当前线程中获取ThreadLocalMap。
3.不为空则将副本值存入当前的ThreadLocal为key的map中。
4.为空就创建。

3. ThreadLocalMap解析

待补充

你可能感兴趣的:(ThreadLocal源码解析)