ThreadLocal的set方法原理示例解析

2023-05-16 0 3,617

目录

前沿知识

  • ThreadLocal存储线程变量,使用set方法设置变量,使用get方法获取变量
  • 线程隔离的实现是每个Thread有一个类型ThreadLocal.ThreadLocalMap的实例变量threadLocals。如下图所示,ThreadLocalMap内部有一个Entry数组,每个Entry的key是ThreadLocal,也就是referent对象,value是设置的值;该类的size变量记录当前数组使用容量;threshold变量记录阈值,默认总容量的三分之二,初始是10

ThreadLocal的set方法原理示例解析

  • threadLocal通过哈希算法决定落于哪一个Entry,GC时,如果threadLocal没有引用,会被回收,即referent值为null,否则不回收,value不会回收,因此要使用remove方法删除对应Entry,否则可能会出现内存泄漏

set方法

ThreadLocal->set()

ThreadLocal的set方法原理示例解析

第一种:如果线程第一次执行set方法,此时map为空,会创建。在此过程中初始化entry的个数为16,threshold为10,同时根据哈希值定位对应下标的entry并赋值

如果map不为空,走ThreadLocalMapset方法,根据哈希值找到对应的下标。从源代码中可知:

第二种:如果该下标为空,那么直接赋值

如果该下标不为空,那么从当前下标开始遍历,直到下一个entry为null时停止

第三种:如果entry的key是当前thread,直接替换值

第四种:如果循环结束,说明遇到了空entry,那么直接赋值到该下标

如果之前发生了GC,那么entry不为空,但是key为空,此时调用replaceStaleEntry方法

记录此下标为staleSlot、slotToExpunge变量,从当前下标的前一个entry开始遍历,直到entry为null时停止,如果有回收的entry,那么记录它的下标,赋值到slotToExpunge变量

从当前下标的后一个entry开始遍历,直到entry为null时停止

第五种:如果遇到了key相等的情况,那么替换值,该entry与staleSlot下标的entry交换。如果向前遍历没有找到回收的entry,那么记录并赋值到slotToExpunge变量。清理过期entry,最后返回

第六种:如果循环结束,说明遇到了空entry,也没有找到key相等的entry。那么清除staleSlot下标的value,然后新建entry。如果有记录过期entry,那么会清理,最后返回

赋值结束后,还会进行一次尝试清理,如果没有过期entry,并且当前容量大于等于阈值,走扩容rehash方法

清理与扩容

expungeStaleEntry(staleSlot):由于传入的下标staleSlot所在entry一定是GC之后的,因此会将entry的值设为null,随后删除entry。从下一个entry开始遍历,直到entry为null时停止,如果entry是GC过的,将value置为null,否则将key重新哈希和分配,这样的目的是使得entry离正确的下标位置更接近一些。最后返回entry为null的坐标

cleanSomeSlots(i,n):参数n一般是当前的size值。从i的下一个entry开始遍历,每遍历一次,n的值就减少一半,直到为0时停止。如果所在下标的entry是GC过的,那么会调用一次expungeStaleEntry(staleSlot)方法

rehash():首先调用一次清理方法,然后判断当前容量是否超过阈值的四分之三(约总容量的二分之一),然后才真正扩容,每次扩容一倍。循环遍历entry数组,如果entry发生GC,那么将值设置为null,否则将key重新哈希和分配,最后重新计算阈值和当前使用容量

总结

总的来说,执行set方法时,一共有六种不同的情况。ThreadLocalMapHashMap相比,它们的实现都是数组+hash定位,但是它们的冲突、扩容实现却大不相同,ThreadLocalMap还会清理过期entry,这种独特的实现方式值得探究

以上就是ThreadLocal的set方法原理示例解析的详细内容,更多关于ThreadLocal set方法原理的资料请关注其它相关文章!

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 ThreadLocal的set方法原理示例解析 http://www.20zxx.cn/704907/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务