ThreadLocal源码剖析(简单理解)

news2025/1/20 14:59:16

Thread部分源码

public
class Thread implements Runnable {
    ThreadLocal.ThreadLocalMap threadLocals = null;
}

ThreadLocal源码,其中ThreadLocal有一个静态内部类ThreadLocalMap,这个Map不是类似二叉树类型的,只是一个普通数组,其中具体使用什么算法其实我也不太理解.
然后对于每个线程Thread,他都有自己的一个ThreadLocalMap ,也就是说每一个线程Thread都有自己的一个数组!,然后这个数组的CRUD由ThreadLocal类去干!并且注意,这个数组是在ThreadLocalMap里面的,也就是说,
ThreadLocal有一个静态内部类ThreadLocalMap,这个静态内部类ThreadLocalMap还有一个静态内部类Entry的数组,前面说的这个数组的类型就是Entry类型的!!
②Thread把ThreadLocalMap作为成员变量threadLocals,由于threadLocals是数组,因此数组存储类型为Thread Local,每次就把ThreadLocal<T>类型的作为Key存储到数组里面去.每额外声明一个ThreadLocal类型的变量就相当于往ThreadLocalMap中添加一个实体Entry,其中Entry的内容为Key<ThreadLocal>----------------Value<T>,其中T是声明ThreadLocal的泛型!

上面圆圈2内容一定要结合下面这个图片来理解!!!!

在这里插入图片描述

public class ThreadLocal<T> {
	//所有所有的ThreadLocal方法都是首先获取当前线程对象Thread  t.
	//然后用t获取它的threadLocals成员变量,
	//因为threadLocals是一个KV架构的数组,每次就是在数组上进行CRUD操作!!!!
    public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
        //输入ThreadLocal类型的Key,输入唯一对应的Value,
        //这里因为get方法是ThreadLocal的实例方法
        //所以getEntry直接传入this
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }
    //所有所有的ThreadLocal方法都是首先获取当前线程对象Thread  t.
	//然后用t获取它的threadLocals成员变量,
	//因为threadLocals是一个KV架构的数组,每次就是在数组上进行CRUD操作!!!!
    public void set(T value) {
        Thread t = Thread.currentThread();
        //通过当前运行的线程直接获取该线程绑定的数组
        ThreadLocalMap map = getMap(t);
        //通过输入Key,设置Key对应的value
        if (map != null) {
            map.set(this, value);
        } else {
            createMap(t, value);
        }
    }
    //所有所有的ThreadLocal方法都是首先获取当前线程对象Thread  t.
	//然后用t获取它的threadLocals成员变量,
	//因为threadLocals是一个KV架构的数组,每次就是在数组上进行CRUD操作!!!!
    public void remove() {
         ThreadLocalMap m = getMap(Thread.currentThread());
         if (m != null) {
             m.remove(this);
         }
     }
    ThreadLocalMap getMap(Thread t) {
        return t.threadLocals;
    }
    public ThreadLocal() {
    }
    //Thread维护的一个ThreadLocalMap,也就是说Thread维护的一个数组而已
    static class ThreadLocalMap {

        static class Entry extends WeakReference<ThreadLocal<?>> {
            
            Object value;

            Entry(ThreadLocal<?> k, Object v) {
                super(k);
                value = v;
            }
        }

       //初始数组数量
        private static final int INITIAL_CAPACITY = 16;

        //实际存储的数组
        private Entry[] table;

        /**
         * table中的entry数量
         */
        private int size = 0;
}

③所有所有的 T h r e a d L o c a l ThreadLocal ThreadLocal方法都是首先获取当前线程对象 T h r e a d Thread Thread t t t.然后用t获取它的threadLocals成员变量,因为threadLocals是一个KV架构的数组,每次就是在数组上进行 C R U D CRUD CRUD操作!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】剑指 Offer <二刷>(5)

目录 题目&#xff1a;剑指 Offer 10- II. 青蛙跳台阶问题 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 11. 旋转数组的最小数字 - 力…

MIPI D-PHY的初始化(MIPI Alliance Xilinx)

DPHY的基本介绍及使用已有很多文章&#xff0c;基本是基于《MIPI Alliance Specification for D-PHY 》的内容&#xff0c;学习时也以此为准&#xff0c;可参考CSDN上的文章。着重讲述MIPI D-PHY的初始化部分 1 D-PHY的功能及使用 下面的文章讲的不错&#xff0c;既有理论&…

内存管理方式

内存管理 一、C/C内存分布1、内存空间的介绍2、示例题目3、示例题目图解 二、C语言动态内存管理方式1、代码2、介绍 三、C内存管理方式1、概念2、代码3、代码所代表的意义 四、new和delete操作自定义类型1、代码2、运行结果3、特点 五、operator new与operator delete函数1、概…

【算法系列篇】模拟算法

文章目录 前言1.替换所有问号1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 提莫攻击2.1 题目要求2.2 做题思路2.3 Java代码实现 3. N 字形变换3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 外观数列4.1 题目要求4.2 做题思路4.3 Java代码实现 5. 数青蛙5.1 题目要求5.2 做题思…

CXL.mem S2M Message 释义

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

【操作系统】一文快速入门,很适合JAVA后端看

作者简介&#xff1a; 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 1.概述 操作系统可以看作一个计算机的管理系统&#xff0c;对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块&#xff1a;运算器、控制器、存储器、输入设备、输出设备。操作…

使用candump+grep查看CAN报文

在Linux系统中观察看CAN报文&#xff0c;我们一般使用candump&#xff0c;但是有时候会发现总线上CAN报文太多&#xff0c;例如开启了好几个PDO&#xff0c;这就导致想看的报文被夹杂到报文的海洋里&#xff0c;然后再去找&#xff0c;非常麻烦。 candump也提供了只观察某个报…

LeetCode 无重复字符的最长子串 打败100%的人

&#x1f600;前言 LeetCode上的“无重复字符的最长子串”问题要求我们找到给定字符串中不包含重复字符的最长子串的长度。这个问题是一个典型的滑动窗口技巧的应用&#xff0c;需要有效地处理字符出现的情况来找到解决方案。 . 在本解决方案中&#xff0c;我们将探讨两种不同的…

EMC VNX2代一键关机方法

由于不正确的EMC VNX存储系统的关机导致客户业务中断&#xff0c;数据丢失的案例数不胜数。不正确的关机顺序&#xff0c;很容易造成内存中的数据丢失&#xff0c;进而导致dirty cache&#xff0c;然后系统的LUN和POOL就无法online&#xff0c;业务中断。本文仅仅对EMC 2代产品…

Vue——vue3+element plus实现多选表格使用ajax发送id数组

代码来源: Vue 3结合element plus&#xff08;问题总结二&#xff09;之 table组件实现多选和清除选中&#xff08;在vue3中获取ref 的Dom&#xff09;_multipletableref.value.togglerowselection()打印出来的是u_子时不睡的博客-CSDN博客 前言 为了实现批量删除功能的功能…

linux编程第一部分总结

C多线程安全原则 对象析构很复杂&#xff0c;我们采用shared_ptr和weak_ptr来做 enable_shared_from_this<>是用来做回调的&#xff0c;因为多线程中可能对象的生命周期比传出去的this指针短&#xff0c;同时为了不延长对象的生命周期&#xff0c;我们把shared_ptr转成we…

单目标应用:基于麻雀搜索算法SSA的微电网优化调度MATLAB

一、微网系统运行优化模型 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、麻雀搜索算法简介 麻雀搜索算法 (Sparrow Search Algorithm, SSA) 是一种新型的群智能优化算法&#xff0c;于2020…

Scalene:Python CPU+GPU+内存分析器,具有人工智能驱动的优化建议

一、前言 Python 是一种广泛使用的编程语言&#xff0c;通常与其他语言编写的库一起使用。在这种情况下&#xff0c;如何提高性能和内存使用率可能会变得很复杂。但是&#xff0c;现在有一个解决方案&#xff0c;可以轻松地解决这些问题 - 分析器。 分析器旨在找出哪些代码段…

一文吃透KMP算法

前言&#xff1a;今天&#xff0c;我们要来学习的字符串的高效匹配算法&#xff0c;KMP算法&#xff0c;用于在一个文本串中查找一个模式串的出现位置。相比于朴素的字符串匹配算法&#xff0c;KMP算法具有更低的时间复杂度&#xff0c;KMP算法的核心思想是利用已匹配的部分信息…

如何在Spring Boot应用中使用Nacos实现动态更新数据源

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

zabbix概述及简单的在centos7安装Zabbix5.0及添加监控对象

目录 一、概述 1、概念 2、Zabbix构成&#xff1a; 3、Zabbix的专业术语包括&#xff1a; 4、Zabbix的工作流程如下&#xff1a; 5、Zabbix的进程包括&#xff1a; 6、Zabbix的监控框架包括&#xff1a; 7、Zabbix的配置流&#xff1a; 8、zabbix程序结构 9、 zabbix…

基于YOLOV8模型的农作机器和行人目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型的农作机器和行人目标检测系统可用于日常生活中检测与定位农作机和行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标…

CXL.cache H2D/D2H 请求响应对应关系

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

【大数据】Apache Iceberg 概述和源代码的构建

Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…

手写RPC框架--3.搭建服务注册与发现目录结构

RPC框架-Gitee代码(麻烦点个Starred, 支持一下吧) RPC框架-GitHub代码(麻烦点个Starred, 支持一下吧) 搭建服务注册与发现目录结构 搭建服务注册与发现目录结构a.基于ZooKeeper的服务发现b.搭建基础工程c.基础代码d.编写架子工程e.创建zookeeper基础目录结构 搭建服务注册与发现…