Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >源码解析:ThreadLocal(3)

源码解析:ThreadLocal(3)

作者头像
爪哇缪斯
发布于 2023-05-09 13:49:06
发布于 2023-05-09 13:49:06
1450
举报
文章被收录于专栏:爪哇缪斯爪哇缪斯

3.5> replaceStaleEntry(key, value, i)

  • 当发现待插入的位置上已经被其他Entry占用了,并且它的key值与我们不同(即:不是同一个ThreadLocal实例),那么,当这个已存在的Entry元素key==null的时候,逻辑上就走到了第二个红框里的方法——replaceStaleEntry(key, value, i),该方法是用来替换“陈旧的”Entry的。下面我们来看一下这个方法的代码和注释:
  • 流程图如下所示:
  • 向前遍历的示意图如下所示:
  • 向后遍历的示意图如下所示:
  • 结合向前遍历和向后遍历(以case2为例)的两部分,最终的结果如下所示:

3.6> expungeStaleEntry(int staleSlot)

  • 上面介绍完了replaceStaleEntry方法之后,我们发现,方法里面都调用了如下方法:

【注意】

方法的入参是slotToExpunge,它代表的含义是——我们上面“施工”范围内,最左侧的“陈旧”Entry下标位置。

其实也就是说,下面的清理工作,是以slotToExpunge作为起点,然后在“施工”范围内,向后一个个遍历处理“陈旧”Entry。

  • cleanSomeSlots这个方法在开篇的set方法的源码截图中用红框标注过,也算是我们见过面的方法了。但是expungeStaleEntry方法我们是第一次见到了,那么我们就先来分析它吧。还是老样子,源码和注释如下所示:

【解释】

  • 以slotToExpunge作为起点进行遍历,如果发现k==null(即:“陈旧”Entry),那么就赋值e.value=null,当前位置的Entry=null,这样gc就可以对其进行回收了。
  • 下面还会对每个k不为null的正常Entry进行重新的下标定位,目的就是让后面的元素往前面移动,因为开放地址寻找元素的时候,遇到null就停止寻找了,由于上面if代码中,k==null的时候已经设置entry为null了,不移动的话,后面的元素就访问不到了。
  • 找到新的位置后,把Entry放到新的位置上,即:tab[h]=e;
  • 流程图如下所示:

后面的内容,参见:ThreadLocal源码精讲(4)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爪哇缪斯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java源码之ThreadLocal
详细介绍一下ThreadLocal是如何实现为线程提供变量副本的,方便下面源码的理解: 首先我们要知道每个线程下都有一个私有变量map,当我们使用ThreadLocal进行set(val)变量时,会向当前线程下的map中put一个键为当前ThreadLocal对象(虚引用),值为val的键值对,这样当使用ThreadLocal的get方法时,会直接向当前线程下的map获得键为此ThreadLocal的值。由于此操作只在当前线程下,所以完美的避免了并发
每天学Java
2020/06/01
4990
Java源码之ThreadLocal
谁问你ThreadLocal,就把这篇文章丢给他
ThreadLocal是线程局部变量,所谓的线程局部变量,就是仅仅只能被本线程访问,不能在线程之间进行共享访问的变量。在各个Java web的各种框架中ThreadLocal几乎已经被用烂了,spring中有使用,mybatis中也有使用,hibernate中也有使用,甚至我们写个分页也用ThreadLocal来传递参数……这也从侧面说明了ThreadLocal十分的给力。
好好学java
2018/09/21
5720
谁问你ThreadLocal,就把这篇文章丢给他
用了这么久ThreadLocal,它的原理你还不懂吗
我们很多时候为了实现数据在线程级别下的隔离,会使用到ThreadLocal,那么TheadLocal是如何实现数据隔离的呢?今天就和大家一起分析一下ThreadLocal的实现原理。
Java进阶之路
2022/08/03
4420
用了这么久ThreadLocal,它的原理你还不懂吗
ThreadLocal
例如,以下类生成对每个线程唯一的局部标识符。 线程 ID 是在第一次调用 UniqueThreadIdGenerator.getCur
乐事
2020/05/10
5380
ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波
ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring。
WriteOnRead
2020/07/10
7590
面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)
(高清无损原图.pdf关注公众号后回复 ThreadLocal 获取,文末有公众号链接)
一枝花算不算浪漫
2020/05/12
1.4K0
深入细节ThreadLocalMap
前面一篇文章ThreadLocal浅析,让我们大概了解其内部运行方式,不熟悉ThreadLocal的同学,在指教下面文章前建议看下,或多或少有点帮助。
笔头
2022/02/10
1.1K3
自信,这是最好的ThreadLocal分析
ThreadLocal,稍微一深入问你一点细节,你能答出来么?估计很多人都答不上来,因为没有真正去了解过,如果你不熟悉这块,不如趁这次机会弄懂 ThreadLocal。读完会让你对 ThreadLocal 印象深刻,丛容面对 ThreadLocal 相关问题。
Rouse
2021/05/28
5300
自信,这是最好的ThreadLocal分析
ThreadLocal超深度源码解读,为什么要注意内存泄漏?不要道听途说,源码底下见真知!
在工作中,多线程访问同一个共享变量时存在并发问题,要么给这个共享变量加锁,要么将变量私有化,能不加锁就不加锁,ThreadLocal就是让每个线程访问自己的本地变量来避免并发问题。
100000860378
2021/04/15
4300
ThreadLocal超深度源码解读,为什么要注意内存泄漏?不要道听途说,源码底下见真知!
个人对哈希数据结构学习总结 -- 实践篇 -- 上
哈希表这个数据结构相信各位都不陌生,无论是高级语言,还是各大数据库底层实现都不离开它,所以本文我想来聊聊我个人对哈希表的一些看法,同时也是对哈希表这个知识点做一次系统性的梳理和总结。
大忽悠爱学习
2023/10/11
3060
个人对哈希数据结构学习总结 -- 实践篇 -- 上
ThreadLocal 源码解读
ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。
java思维导图
2019/11/04
5190
一文带你读懂JDK源码:ThreadLocal类
线程封闭是实现线程安全的手段之一(另外的线程安全手段还有:使用并发工具类,可以参考)。
后台技术汇
2022/05/28
2400
一文带你读懂JDK源码:ThreadLocal类
ThreadLocal全面解析
ThreadLocal类保证了线程内部的变量在多线程环境下相对于其他线程是不可见的。
虞大大
2020/08/26
4490
ThreadLocal全面解析
ThreadLocal源码分析
ThreadLocal的作用是保证当前线程对象的唯一性,在android源码中有大量的应用,是怎么实现的呢?
曾大稳
2018/09/11
3360
源码解析:ThreadLocal(4)
返回true:表示存在“陈旧”的Entry且已经被清除(但并不表示完全清除所有的“陈旧”Entry,只表示执行过这种操作)
爪哇缪斯
2023/05/09
1730
源码解析:ThreadLocal(4)
ThreadLocal源码剖析及应用
ThreadLocal,即线程变量,其是为了解决多线程并发访问的问题,提供了一个线程局部变量,让访问某个变量的线程都拥有自己的线程局部变量值,这样线程对变量的访问就不存在竞争问题,也不需要同步。与对共享变量加锁,使得线程对共享变量进行串行访问不同,ThreadLocal相当于让每个线程拥有自己的变量副本,用空间换取时间。
星沉
2021/12/12
9920
ThreadLocal源码剖析及应用
【源码篇】ThreadLocal的奇思妙想(万字图文)
ThreadLocal的文章在网上也有不少,但是看了一些后,理解起来总感觉有绕,而且看了ThreadLocal的源码,无论是线程隔离、类环形数组、弱引用结构等等,实在是太有意思了!我必须也要让大家全面感受下其中所蕴含的那些奇思妙想! 所以这里我想写一篇超几儿通俗易懂解析ThreadLocal的文章,相关流程会使用大量图示解析,以证明:我是干货,不是水比!
小呆呆666
2021/05/06
8290
ThreadLocal原理及源码解析(一步一步点进去,不要背了,学思想)
我们知道,一个共享变量或者资源,在多个线程操作的时候,肯定是会相互影响,不能隔离的
向着百万年薪努力的小赵
2022/12/02
4320
ThreadLocal原理及源码解析(一步一步点进去,不要背了,学思想)
ThreadLocal学习笔记
Java项目中我们经常采用ThreadLocal作为session。显然ThreadLocal是线程隔离的。如果是线程隔离,那么ThreadLocal必然是线程的局部变量。在Thread类中我们记得有ThreadLocal相关的实体,如下图所示。
写一点笔记
2020/09/01
5030
ThreadLocal学习笔记
ThreadLocal源码分析-黄金分割数的使用
最近接触到的一个项目要兼容新老系统,最终采用了ThreadLocal(实际上用的是InheritableThreadLocal)用于在子线程获取父线程中共享的变量。问题是解决了,但是后来发现对ThreadLocal的理解不够深入,于是顺便把它的源码阅读理解了一遍。在谈到ThreadLocal之前先买个关子,先谈谈黄金分割数。本文在阅读ThreadLocal源码的时候是使用JDK8(1.8.0_181)。
Throwable
2020/06/23
1.2K0
相关推荐
Java源码之ThreadLocal
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档