zoukankan      html  css  js  c++  java
  • 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信息
  • 相关阅读:
    Linux 信号详解四(pause,alarm)
    Linux 信号详解三(sleep,raise)
    Linux 信号详解二(信号分类,信号处理,kill)
    下载windows server ISO(msdn订户下载)
    科2项目攻略
    Centos 7 LVM xfs文件系统修复
    python连接redis sentinel集群
    jquery on() bind()绑定的点击事件在js动态新添加的元素生效
    虚拟化环境下的CentOS7网络环境存在的问题
    石排科目二考场最新攻略
  • 原文地址:https://www.cnblogs.com/geekdc/p/13533411.html
Copyright © 2011-2022 走看看