前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >源码解析:ThreadLocal(2)

源码解析:ThreadLocal(2)

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

3.3> nextIndex和prevIndex

  • 我们先来看第一个红框中的方法nextIndex(i, len),其实通过该方法,我们还可以引出prevIndex(i, len)方法。源码和注释如下所示:

【解释】

通过源码,我们可以得出以下结论:

nextIndex就是从指定的下标i开始,向后获取下一个位置的下标值。

preIndex就是从指定的下标i开始,前向获取上一个位置的下标值。

那么,如果越界了怎么办呢?它们会采用循环查找法。即:获取队尾的下一个下标就会返回队首的下标;获取队首的上一个下标就会返回队尾的下标。如下所示:


3.4> 开放地址法

  • 当我们看到这里,就发现这个ThreadLocalMap有些“奇怪”,它并没有按照我们之前在学习HashMap的方式去解决哈希冲突,即:数组+链表。而它其实使用的是一种叫做“开放地址法”作为解决哈希冲突的一种方式。
  • 什么是开放地址法呢?

开放地址法的基本思想就是:一旦发生了冲突,那么就去寻找下一个空的地址;那么只要表足够大,空的地址总能找到,并将记录插入进去。

  • ThreadLocalMap和HashMap的区别是什么呢?
    • HashMap
      • 数据结构数组+链表
      • 通过链地址法解决hash冲突的问题
      • 里面的Entry内部类的引用都是强引用
    • ThreadLocalMap
      • 数据结构仅仅是数组
      • 通过开放地址法来解决hash冲突的问题
      • Entry内部类中的key是弱引用,value是强引用
  • 链地址法和开放地址法的优缺点是什么呢?
    • 开放地址法
      • 容易产生堆积问题,不适于大规模的数据存储
      • 散列函数的设计对冲突会有很大的影响,插入时可能会出现多次冲突的现象。
      • 删除的元素是多个冲突元素中的一个,需要对后面的元素作处理,实现较复杂。
    • 链地址法:
      • 处理冲突简单,且无堆积现象,平均查找长度短。
      • 链表中的结点是动态申请的,适合构造表不能确定长度的情况。
      • 删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。
      • 指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间。
  • ThreadLocalMap采用开放地址法原因是什么?
    • ThreadLocal往往存放的数据量不会特别大(而且key 是弱引用又会被垃圾回收,及时让数据量更小)。
    • 采用开放地址法简单的结构会更节省空间,同时数组的查询效率也是非常高,加上第一点的保障,冲突概率也比较低。
  • 那么,当我们了解了开发地址法的原理之后,我们就有了看懂下面代码的重要武器了。好,那我们继续看下面的源码

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ThreadLocal企业中真实应用
SimpleDateFormat(下面简称sdf)类内部有一个Calendar对象引用,它用来储存和这个sdf相关的日期信息,例如sdf.parse(dateStr), sdf.format(date) 诸如此类的方法参数传入的日期相关String、Date等等,都是交友Calendar引用来储存的,这样就会导致一个问题,如果你的sdf是个static的, 那么多个thread 之间就会共享这个sdf, 同时也是共享这个Calendar引用, 并且, 观察 sdf.parse() 方法,parse方法里没有保证原子性,所以存在线程安全问题:
公众号 IT老哥
2020/09/16
1.2K0
ThreadLocal企业中真实应用
一文带你读懂JDK源码:ThreadLocal类
线程封闭是实现线程安全的手段之一(另外的线程安全手段还有:使用并发工具类,可以参考)。
后台技术汇
2022/05/28
2400
一文带你读懂JDK源码:ThreadLocal类
ThreadLocal全面解析
ThreadLocal类保证了线程内部的变量在多线程环境下相对于其他线程是不可见的。
虞大大
2020/08/26
4500
ThreadLocal全面解析
JUC---ThreadLocal原理详解
通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。**如果想实现每一个线程都有自己的专属本地变量该如何解决呢?**
用户11365589
2024/11/16
1090
ThreadLocal超深度源码解读,为什么要注意内存泄漏?不要道听途说,源码底下见真知!
在工作中,多线程访问同一个共享变量时存在并发问题,要么给这个共享变量加锁,要么将变量私有化,能不加锁就不加锁,ThreadLocal就是让每个线程访问自己的本地变量来避免并发问题。
100000860378
2021/04/15
4320
ThreadLocal超深度源码解读,为什么要注意内存泄漏?不要道听途说,源码底下见真知!
ThreadLocal到底有没有内存泄漏?从源码角度来剖析一波
ThreadLocal 也是一个使用频率较高的类,在框架中也经常见到,比如 Spring。
WriteOnRead
2020/07/10
7650
仅用一个ThreadLocal,就把面试官说服的明明白白!
安琪拉:面试官你好,我是草丛三婊,最强中单(妲己不服),草地摩托车车手,第21套广播体操推广者,火的传人安琪拉,这是我的简历,请过目。
Java程序猿
2021/05/09
3480
Java的ThreadLocal
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。
用户3467126
2019/07/30
8030
Java的ThreadLocal
ThreadLocal原理及源码解析(一步一步点进去,不要背了,学思想)
我们知道,一个共享变量或者资源,在多个线程操作的时候,肯定是会相互影响,不能隔离的
向着百万年薪努力的小赵
2022/12/02
4380
ThreadLocal原理及源码解析(一步一步点进去,不要背了,学思想)
Java并发之ThreadLocal
首先说明,ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。
趣学程序-shaofeer
2020/05/18
5990
Java并发之ThreadLocal
Java并发-ThreadLocal
每个线程内部都有一个ThreadLocalMap,每个ThreadLocalMap里面都有一个Entry[]数组,Entry对象由ThreadLocal和数据组成。
lpe234
2021/03/02
4330
ThreadLocal
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。
earthchen
2020/09/24
7130
ThreadLocal 源码解读
ThreadLocal源码解读,网上面早已经泛滥了,大多比较浅,甚至有的连基本原理都说的很有问题,包括百度搜索出来的第一篇高访问量博文,说ThreadLocal内部有个map,键为线程对象,太误导人了。
java思维导图
2019/11/04
5190
深入详解ThreadLocal
在我们日常的并发编程中,有一种神奇的机制在静悄悄地为我们解决着各种看似棘手的问题,它就是「ThreadLocal」。
BookSea
2023/08/29
3650
深入详解ThreadLocal
ThreadLocal源码剖析及应用
ThreadLocal,即线程变量,其是为了解决多线程并发访问的问题,提供了一个线程局部变量,让访问某个变量的线程都拥有自己的线程局部变量值,这样线程对变量的访问就不存在竞争问题,也不需要同步。与对共享变量加锁,使得线程对共享变量进行串行访问不同,ThreadLocal相当于让每个线程拥有自己的变量副本,用空间换取时间。
星沉
2021/12/12
1K0
ThreadLocal源码剖析及应用
面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)
(高清无损原图.pdf关注公众号后回复 ThreadLocal 获取,文末有公众号链接)
一枝花算不算浪漫
2020/05/12
1.4K0
面试再问ThreadLocal,别说你不会
以前面试的时候问到ThreadLocal总是一脸懵逼,只知道有这个哥们,不了解他是用来做什么的,更不清楚他的原理了。表面上看他是和多线程,线程同步有关的一个工具类,但其实他与线程同步机制无关。
业余草
2019/10/24
3270
重温并发知识,从ThreadLocal开始
ThreadLocal提供线程的局部变量,这种变量与普通变量的区别在于,每个访问这种变量的线程都有自己的、独立的变量副本。用于解决多线程间的数据隔离问题。
java技术爱好者
2021/08/27
5330
重温并发知识,从ThreadLocal开始
ThreadLocal 源码解析
ThreadLocal 顾名思义就是在每个线程内部都会存储只有当前线程才能访问的变量的一个副本,然后当前线程修改了该副本的值后而不会影响其他线程的值,各个变量之间相互不影响。
Java技术编程
2020/05/25
3920
线程本地存储 ThreadLocal
线程本地存储也是解决特定场景下线程安全问题的思路之一(每个线程都访问本线程自己的变量)。
真正的飞鱼
2022/08/08
2.5K0
线程本地存储 ThreadLocal
相关推荐
ThreadLocal企业中真实应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档