个人记录-ThreadLocal

ThreadLocal
线程本地变量,属于线程的局部变量,为每个线程提供一个空间,保存该线程自己的变量。

隔离线程,以及防止线程数据不安全的问题,无法访问别的线程的ThreadLocal获取别的线程的数据。

ThreadLocal.ThreadLocalMap
用于存储每个线程 & 该线程设置的存储在ThreadLocal变量的值。

ThreadLocalMap
键Key = 当前ThreadLocal实例
值value = 该线程设置的存储在ThreadLocal变量的值。

该key是 ThreadLocal对象的弱引用;当要抛弃掉ThreadLocal对象时,垃圾收集器会忽略该 key的引用而清理掉ThreadLocal对象。

 /** 
    * 设置ThreadLocal变量引用的值
    *  ThreadLocal变量引用 指向 ThreadLocalMap对象,即设置ThreadLocalMap的值 = 该线程设置的存储在ThreadLocal变量的值
    *  ThreadLocalMap的键Key = 当前ThreadLocal实例
    *  ThreadLocalMap的值 = 该线程设置的存储在ThreadLocal变量的值
    **/  
    public void set(T value) {
        // 1. 获得当前线程
        Thread t = Thread.currentThread();
        // 2. 获取该线程的ThreadLocalMap对象
        ThreadLocalMap map = getMap(t);
        // 3. 若该线程的ThreadLocalMap对象已存在,则替换该Map里的值;否则创建1个ThreadLocalMap对象
        if (map != null)
            // 替换
            map.set(this, value);
        else
            // 创建
            createMap(t, value);
    }
 /** 
    * 获取ThreadLocal变量里的值
    * 由于ThreadLocal变量引用 指向 ThreadLocalMap对象,即获取ThreadLocalMap对象的值 = 该线程设置的存储在ThreadLocal变量的值
    **/ 
    public T get() {
        // 1. 获得当前线程
        Thread t = Thread.currentThread();
        // 2. 获取该线程的ThreadLocalMap对象
        ThreadLocalMap map = getMap(t);
        // 3. 若该线程的ThreadLocalMap对象已存在,则直接获取该Map里的值;否则则通过初始化函数创建1个ThreadLocalMap对象
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null)
                // 直接获取值
                return (T)e.value; 
        }
        return setInitialValue(); // 初始化
    }
 /** 
    * 初始化ThreadLocal的值
    **/ 
    private T setInitialValue() {
        //获取初始值【】
        T value = initialValue();
        // 1. 获得当前线程
        Thread t = Thread.currentThread();
        // 2. 获取该线程的ThreadLocalMap对象
        ThreadLocalMap map = getMap(t);
         // 3. 若该线程的ThreadLocalMap对象已存在,则直接替换该值;否则则创建
        if (map != null)
            // 替换
            map.set(this, value); 
        else
            // 创建
            createMap(t, value); 
        return value;
    }

  /** 
    * 获取当前线程的threadLocals变量
    **/ 
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
  /** 
    * 创建当前线程的ThreadLocalMap对象
    **/ 
    void createMap(Thread t, T value) {
        // 新创建1个ThreadLocalMap对象 放入到 Thread类的threadLocals变量引用中:
        // a. ThreadLocalMap的键Key = 当前ThreadLocal实例
        // b. ThreadLocalMap的值 = 该线程设置的存储在ThreadLocal变量的值
        t.threadLocals = new ThreadLocalMap(this, value);
        // 即 threadLocals变量 属于 Thread类中
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容