让人迷糊的ThreadLocalMap,看清他的本质

ThreadLocalMap

ThreadLocalMap是ThreadLocal的内部类,主要提供了数据存储和获取的API和存储真实数据的数据结构

我们怎么才能更好的理解这个数据机构呢,首先给出答案:其实我们被他的名字弄迷糊了,他存数据的结构其实本质上是一个Array,我们把ThreadLocalMap改名成ThreadLocalArray就很清晰了;

我们调用ThreadLocal的set方法保存数据时,会经历以下流程:
1、获得当前的线程对象
2、获得当前线程对象的ThreadLocalMap属性
3、如果ThreadLocalMap属性不为空,则调用ThreadLocalMap类的set方法
4、如果ThreadLocalMap属性为空,则通过ThreadLocalMap的构造方法创建一个ThreadLocalMap对象

ThreadLocalMap底层的数据结构是一个数组,看一下如下图就很清晰了:

在这里插入图片描述

Entry

首先给出答案吧,一个Entry对应的是一个 new ThreadLocal()对象执行set方法后保存的值;
比如我们项目中创建了多个ThreadLocal对象A、B、C并且每一个对象都调用了set方法,那么上面的数组就会被填充多个值;

Entry定位规则

底层原理就是根据上面的对象A、B、C计算出这些对象在Entry数组中应该占用的位置,然后将set方法传的值保存进去
定位规则是调用ThreadLocal对象A、B、C的 nextHashCode()方法然后和Entry数组的容量做余数

Entry数组是Object数组,所以可以存任何类型

nextHashCode方法
    private final int threadLocalHashCode = nextHashCode();/*** The next hash code to be given out. Updated atomically. Starts at* zero.*/private static AtomicInteger nextHashCode =  new AtomicInteger();/*** The difference between successively generated hash codes - turns* implicit sequential thread-local IDs into near-optimally spread* multiplicative hash values for power-of-two-sized tables.*/private static final int HASH_INCREMENT = 0x61c88647;/*** Returns the next hash code.*/private static int nextHashCode() {return nextHashCode.getAndAdd(HASH_INCREMENT);}

重点:
1、上图这一系列的数据都与当前线程绑定的,即不同线程操作ThreadLocal方法都是操作自己线程的数据,不会有线程安全问题
2、ThreadLocal可以理解成一个门面,调用其方法最终都委托到了当前线程的ThreadLocalMap

over~~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生产事故:线程管理不善诱发P0故障

背景 处于业务诉求,需要建立一个统一的调度平台,最终是基于 Dolphinscheduler 的 V1.3.6 版本去做二次开发。在平台调研建立时,这个版本是最新的版本 命运之轮开始转动 事故 表象 上班后业务部门反馈工作流阻塞,登录系统发现大…

java栈和队列

目录 1.栈的概念: 2.栈的一些常用的方法: ​编辑 3.栈的模拟实现: 栈的应用: 4.关于栈的练习 5.队列的概念: 6.队列的使用: 7.模拟队列 8.循环队列 9.双端队列: 10.面试题 1.栈的概念&…

【汇编】存储器

存储器 计算机存储器可分为内部存储器(又称内存或主存)和外部存储器,其中内存是CPU能直接寻址的储存空间,由半导体器件制成 存储单元的地址和内容 计算机存储信息的基本单位是一个二进制位,一位可存储一个二进制数&…

【鸿蒙开发】第二十一章 Media媒体服务(一)

1 简介 Media Kit(媒体服务)提供了AVPlayer和AVRecorder用于播放、录制音视频。 在Media Kit的开发指导中,将介绍各种涉及音频、视频播放或录制功能场景的开发方式,指导开发者如何使用系统提供的音视频API实现对应功能。比如使用…

funasr 麦克风实时流语音识别

参考: https://github.com/alibaba-damo-academy/FunASR chunk_size 是用于流式传输延迟的配置。[0,10,5] 表示实时显示的粒度为 1060=600 毫秒,并且预测的向前信息为 560=300 毫秒。每个推理输入为 600 毫秒(采样点为 16000*0.6=960),输出为相应的文本。对于最后一个语音…

C# dynamic 数据类型

在C#中,dynamic是一种数据类型,它允许在运行时推迟类型检查和绑定。使用dynamic类型,可以编写更具灵活性的代码,因为它允许在编译时不指定变量的类型,而是在运行时根据实际情况进行解析。 dynamic类型的变量可以存储任…

老板最怕你出这样的代码。。。

大家好, 这一个月时间,阿里巴巴、滴滴、腾讯都发生过应用线上故障的事情,很多同学说是降本增“笑”的后果然后圈内流传一个新想法,为了避免“开源节流” 的事情,工作中要写一些防御性的代码。 什么意思?就…

大模型(Large Models):探索人工智能领域的新边界

🌟文章目录 🌟大模型的定义与特点🌟模型架构🌟大模型的训练策略🌟大模型的优化方法🌟大模型的应用案例 随着人工智能技术的飞速发展,大模型(Large Models)成为了引领深度…

python基础——类【类的定义和使用、魔术方法】

📝前言: python中的类,自我感觉在某种程度上和C语言的结构体是有共同之处的,如果有兴趣,可以先看看这篇文章:C语言——结构体类型(一),先了解一下C语言中的结构体&#x…

SpringBoot之集成Redis

SpringBoot之集成Redis 一、Redis集成简介二、集成步骤2.1 添加依赖2.2 添加配置2.3 项目中使用 三、工具类封装四、序列化 (正常都需要自定义序列化)五、分布式锁(一)RedisTemplate 去实现场景一:单体应用场景二&…

第二期书生浦语大模型训练营第三次笔记

RAG RAG是什么? RAG(Retrieval Augmented Generation)技术,通过检索与用户输入相关的信息片段,并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺…

springboot数字化智慧城市管理系统源码

目录 ​系统开发环境 系统功能模块 系统特点 1、智慧城管移动端 2、案件受理 3、AI视频智识别分析 系统应用价值 1、提升案件办理效率 2、提升监管效能 3、提升行政执法水平 4、推进行政执法创新 智慧城管综合执法办案系统功能 现场移动执法 一般程序案件的网上办…