图解ThreadLocal核心方法

news/2024/12/14 12:09:26/

1、put方法逻辑

拿到当前线程
当前当前线程的Map
getMap方法
方法内部逻辑
Map为null
createMap方法内部逻辑
创建Entry数组,原来Entry数组就是上面提到的Map,也及时ThreadLocalMap
根据创建的ThreadLocal哈希值获取下标
根据下标进行赋值
Map不为null
map.set方法内部逻辑
根据传入的ThreadLocal获取下标
根据下标赋值,这里并没有那么简单,其实Entry数组是用来解决哈希冲突的,详情见下面的哈希冲突分析
set(T value)
Thread t = Thread.currentThread()
ThreadLocalMap map = getMap(t)
getMap(Thread t)
return t.threadLocals
createMap(t, value)
t.threadLocals = new ThreadLocalMap(this, firstValue)
table = new Entry[INITIAL_CAPACITY]
int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1)
table[i] = new Entry(firstKey, firstValue)
map.set(this, value)
set(ThreadLocal key, Object value)
i = key.threadLocalHashCode & (len-1)
tab[i] = new Entry(key, value)

Entry继承WeakReference
内部参数设置
key的设置为弱引用
value的设置为强引用
Entry
static class Entry extends WeakReference>
Entry(ThreadLocal k, Object v)
super(k)
value = v

for循环找到符合的下标
nextIndex就是解决哈希冲突的核心方法
内部逻辑,其实就是直接+1个索引位置
for循环内部逻辑,先拿到当前创建的ThreadLocal
当前ThreadLocal已经有值了,说明之前有人set过
直接覆盖值
重哈希法,找到正确的null下标位置,赋值即可
哈希冲突分析
for (Entry e = tab[i]; e != null; e = tab[i = nextIndex(i, len)])
nextIndex(int i, int len)
return ((i + 1 < len) ? i + 1 : 0)
ThreadLocal k = e.get()
k == key
e.value = value
tab[i] = new Entry(key, value)

2、get方法逻辑

得到当前线程
通过当前线程获取ThreadLocalMap=Map
通过threadlocal获取对应的Entry
返回entry的value(其实还是要for循环去依次查找对应的相等的threalocal,但是上上面已经走过具体的哈希冲突了,见 'put方法的哈希重复分析' )
getMap方法逻辑,直接返回一个threadLocals,其实就是个Entry数组
get()
Thread t = Thread.currentThread()
ThreadLocalMap map = getMap(t)
ThreadLocalMap.Entry e = map.getEntry(this)
return entry.value
return t.threadLocals

http://www.ppmy.cn/news/46295.html

相关文章

【音视频第12天】GCC论文阅读(3)

A Google Congestion Control Algorithm for Real-Time Communication draft-alvestrand-rmcat-congestion-03论文理解 看中文的GCC算法一脸懵。看一看英文版的&#xff0c;找一找感觉。 目录 Abstract1. Introduction1.1 Mathematical notation conventions 2. System model2.…

2023年4月广东省计算机软考中/高级备考班招生简章

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

云原生可观测性平台deepflow部署

deepflow是什么 DeepFlow 是云杉网络 (opens new window)开源的一款高度自动化的可观测性平台&#xff0c;是为云原生应用开发者建设可观测性能力而量身打造的全栈、全链路、高性能数据引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技术&#xff0c;创新的实现了 AutoT…

FVM链的Themis Pro(0x,f4) 5日IDO超百万美元,领Filecoin重回高点

交易一直是 DeFi 乃至web3领域最经久不衰的话题&#xff0c;也因此催生了众多优秀的去中心化协议&#xff0c;如 Uniswap 和 Curve。这些协议逐渐成为了整个系统的基石。 在永续合约方面&#xff0c;DYDX 的出现将 WEB2 时代的订单簿带回了web3。其链下交易的设计&#xff0c;仿…

javaSccript---call()、 bind()、 apply()的区别

call()、apply()、bind() 都是用来重定义 this 这个对象的 语法&#xff1a; function.apply(thisArg, [argsArray])//argsArray 是一个可选的数组 function.call(thisArg, arg1, arg2, ...)//arg1、arg2、... 是将传递给函数的参数列表 function.bind(thisArg, arg1, arg2, ..…

软考-项目进度管理(十)

10.2项目进度管理过程 (P298) 10.2.1过程概述 项目进度管理过程包括:(背口诀:规定排估制控) 过程一定要按第四版来记!! 规划进度管理:为了规划进度管理:规划、编制、管理、执行和控制项目进度&#xff0c;制定政策、程序和文档。定义活动: (把工作包分解为活动) 识别和记录为…

windows如何编译各种版本boost库

环境 系统&#xff1a;windows11boost版本&#xff1a;boost-1.70编译器版本&#xff1a;Visual Studio 2019 1. 参数分析 –without&#xff1a;选择不编译某个库 例如不编译python模块--without-python –toolset&#xff1a;指定编译工具 例如指定vs2019--toolsetmsvc-14…

ei会议被检索的时间一般多久,中文期刊论文有doi吗

目录 ei会议被检索的时间一般多久 中文期刊论文有doi吗 中文期刊论文没有oi怎么办