ThreadLocal分析简介【Android学习】

ThreadLocal 提供线程局部变量。通过 ThreadLocal 创建的变量只能被当前线程访问,其他线程无法访问;实现线程间的数据隔离

实现原理

  1. ThreadLocalMap :【ThreadLocal实现原理的支撑】

每个 Thread 对象内部都有一个 ThreadLocalMap

ThreadLocalMap 是 ThreadLocal 的静态内部类

用于存储线程本地变量

  1. 存储结构 :【ThreadLocal存储说明】

ThreadLocalMap 的 key 是 ThreadLocal 对象

value 是实际存储的线程本地变量值

通过弱引用持有 ThreadLocal 对象,防止内存泄漏

主要代码注释【源码注释说明】

java 复制代码
  /**
     * 设置当前线程的本地变量值
     * @param value 要设置的值
     */
    public void set(T value) {
        // 获取当前线程对象
        Thread t = Thread.currentThread();
        // 获取当前线程的ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        if (map != null)
            // 如果ThreadLocalMap存在,以当前ThreadLocal为key存储值
            map.set(this, value);
        else
            // 如果ThreadLocalMap不存在,创建一个新的
            createMap(t, value);
    }

    /**
     * 获取当前线程的本地变量值
     * @return 当前线程的本地变量值
     */
    public T get() {
        // 获取当前线程对象
        Thread t = Thread.currentThread();
        // 获取当前线程的ThreadLocalMap
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            // 从ThreadLocalMap中获取以当前ThreadLocal为key的Entry
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                // 如果Entry存在,返回其value值
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        // 如果未找到值,设置初始值并返回
        return setInitialValue();
    }

    /**
     * 移除当前线程的本地变量值
     */
    public void remove() {
        // 获取当前线程的ThreadLocalMap
        ThreadLocalMap m = getMap(Thread.currentThread());
        if (m != null)
            // 从ThreadLocalMap中移除以当前ThreadLocal为key的条目
            m.remove(this);
    }

    /**
     * 返回当前线程的初始值
     * @return 初始值,默认为null
     * 子类可以重写此方法以提供自定义的初始值
     */
    protected T initialValue() {
        return null;
    }
相关推荐
yantaohk16 分钟前
【2025亲测】中兴B860AV3.2M完美刷机包ATV版本安卓9-解决1G运存BUG,开ADB已ROOT
android·嵌入式硬件·adb·云计算
了一梨24 分钟前
SQLite3学习笔记6:UPDATE(改)+ DELETE(删)数据(C API)
笔记·学习·sqlite
飘若随风1 小时前
JS学习系列-01-什么是JS
开发语言·javascript·学习
乐观勇敢坚强的老彭1 小时前
c++信奥寒假营集训01
android·java·c++
mango_mangojuice1 小时前
C++ 学习笔记(string类)
开发语言·c++·笔记·学习
kdniao11 小时前
PHP 页面中如何实现根据快递单号查询物流轨迹?对接快递鸟在途监控 API 实操
android·开发语言·php
望忆1 小时前
关于《Contrastive Collaborative Filtering for Cold-Start Item Recommendation》的学习
学习
言之。2 小时前
MacBook M3 Pro:React Native 安卓开发
android·react native·react.js
jtymyxmz2 小时前
《Maya2024超级学习手册》3.4.10 实例:制作瓶子模型
学习
小白郭莫搞科技2 小时前
鸿蒙跨端框架Flutter学习:CurvedAnimation曲线动画详解
学习·flutter·harmonyos