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