ThreadLocal

I、java.lang.ThreadLocal 1、定义:ThreadLocal:线程局部变量,它通常是私有类中希望将状态与线程关联的静态字段。ThreadLocal提供了线程间数据隔离的功能,每个线程都会在ThreadLocal中保存一份该线程独有的数据,所以它是线程安全的。
2、数据结构:静态内部类ThreadLocalMap。ThreadLocalMap: 一个键值对Map,底层是Entry 对象数组,Entry对象中键是ThreadLocal对象,值是Object类型的具体存储内容。
ThreadLocal
文章图片

3、api:
ThreadLocal
文章图片

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 = https://www.it610.com/article/initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else// 初始化当前线程的threadLocalMapcreateMap(t, value); return value; } protected T initialValue() { return null; }

【ThreadLocal】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

    推荐阅读