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信息
  • 相关阅读:
    WinForm里保存TreeView状态
    动态规划 回溯和较难题
    go 基本链表操作
    leetcode 42接雨水
    leetcode 旋转数组搜索
    leetcode 牛客编程 子序列 树 数组(积累)
    剑指offer(积累)
    go快排计算最小k个数和第k大的数
    leetcode 打家劫舍
    leetcode 字符串相关问题
  • 原文地址:https://www.cnblogs.com/geekdc/p/13533411.html
Copyright © 2011-2022 走看看