I、java.lang.ThreadLocal

1、定义:ThreadLocal:线程局部变量,它通常是公有类中心愿将状态与线程关联的动态字段。ThreadLocal提供了线程间数据隔离的性能,每个线程都会在ThreadLocal中保留一份该线程独有的数据,所以它是线程平安的。
2、数据结构:动态外部类ThreadLocalMap。ThreadLocalMap: 一个键值对Map,底层是Entry 对象数组,Entry对象中键是ThreadLocal对象,值是Object类型的具体存储内容。

3、api:

get:get以后线程中存储的数据;

public T get() {                       // 获取以后线程            Thread t = Thread.currentThread(); // 查找对应线程的ThreadLocalMap变量       ThreadLocalMap map = getMap(t);            if (map != null) {  // 不为null,返回以后threadLocal 对应的value值                 ThreadLocalMap.Entry e = map.getEntry(this);                    if (e != null) {                            @SuppressWarnings("unchecked")                            T result = (T)e.value;                           return result;                   }            } // 以后线程的threadLocalMap为空,初始化             return setInitialValue();    }    private T setInitialValue() { // 初始化的值为null           T value = initialValue();            Thread t = Thread.currentThread();            ThreadLocalMap map = getMap(t);            if (map != null)                    map.set(this, value);            else            // 初始化以后线程的threadLocalMap                                createMap(t, value);            return value;    }    protected T initialValue() {            return null;    }

set:往以后线程中set数据;

public void set(T value) {            // 获取以后线程            Thread t = Thread.currentThread();// 去查找对应线程的ThreadLocalMap变量     ThreadLocalMap map = getMap(t);            if (map != null)                    map.set(this, value);            else // 第一次调用就创立以后线程的对应的ThreadLocalMap                     // 并且会将值保留进去,key是以后的threadLocal,value就是传进来的值             createMap(t, value);    }    ThreadLocalMap getMap(Thread t) {            return t.threadLocals;    }

remove:清空线程中的数据。
4、局限性:
ThreadLocal在线程池场景容易导致内存溢出(线程池复用线程)
无奈实现父子线程信息传递

II、java.lang.InheritableThreadLocal

III、com.alibaba.ttl.TransmittableThreadLocal