ThreadLocal原理

一、Thread

public class Thread(){
    //省略部分
    
    //属于这个线程的ThreadLocals,这个map由ThreadLocal类维护
    ThreadLocal.ThreadLocalMap threadLocals = null;
    
    //省略部分
}

二、ThreadLocal

public class ThreadLocal(){
 //省略部分
    
//set操作
public void set(T value) {
        //当前调用set方法的线程
        Thread t = Thread.currentThread();
        //获取当前调用线程的ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        if (map != null)
            //this 为静态的一个自定义的ThreadLocal对象的引用,map存在则set
            map.set(this, value);
        else
            //map 不存在则新建
            createMap(t, value);
    }
    
     // new 一个ThreadLocalMap
    void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }
    
// get操作
public T get() {
    
        //当前调用get方法的线程
        Thread t = Thread.currentThread();
        //获取当前线程的ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            //this 为静态的一个自定义的ThreadLocal对象的引用
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }
    
 //省略部分
}

三、小结

  • 每个线程对象都有一个自己的ThreadLocalMap类对象,由ThreadLocal对象维护,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。

  • 将一个共用的ThreadLocal静态实例(通常在需要的方法中自定义)作为key,将不同值对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象

四、使用场景

  • session问题配合Filter一起使用
  • 多数据源配置,通过配置当前线程的datasoure信息
posted @ 2020-08-20 09:59  npe0  阅读(160)  评论(0编辑  收藏  举报