• 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信息
  • 相关阅读:
    2020916 spring总结
    20200915--事务
    20200915-mybatis基础
    20200911--使用注解开发
    20200910--Spring配置
    20200909--spring基础-IOC
    20200909-待补充
    20200909记我所看到的问题
    20200909-spring基础一
    面向对象
  • 原文地址:https://www.cnblogs.com/geekdc/p/13533411.html
Copyright © 2020-2023  润新知