ThreadLocal

作用为会为每个线程 保存线程级别的上下文

public void set(T value) {
        Thread t = Thread.currentThread(); //获取当前线程
        ThreadLocalMap map = getMap(t); //获取当前线程的map 对象
        if (map != null) {
            map.set(this, value);
        } else {
            createMap(t, value);
        }
    }
  • 他会为每个线程维护一个map用于存放线程级别的本地对象。
  • spring的数据库事务上下文也是存放在ThreadLocal里的。
  • 他是弱引用具体讲解可以看 java引用类型

踩坑

  • 之前踩过一个坑,在主线程中开了子线程,在里面拿了threadLocal 结果可想而知。
  • 解决方案也很简单,子线程如果需要主线程的参数那么就把他作为参数传入子线程。