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在线程池场景容易导致内存溢出(线程池复用线程)
无奈实现父子线程信息传递