ThreadLocal精讲

news2024/11/26 0:28:41

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、什么是ThreadLocal?
  • 二、源码分析
    • 1. 首先看下Thread类
    • 2. ThreadLocalMap这是什么?
    • 3. ThreadLocal详解
  • 三、什么是弱引用呢?
    • 3.1 谈谈引用关系都有哪些,区别又是什么?
    • 3.2 ThreadLocal为何使用弱引用
    • 3.3 内存泄漏是什么,如何避免TheadLocal的内存泄漏?
  • 四、总结

是的

一、什么是ThreadLocal?

  • ThreadLocal用来提供线程级别变量,变量只对当前线程见,ThreadLocal通过空间换时间的方案,规避了竞争问题,因为每个线程都有属于自己的变量。
  • TheadLocal为每个使用该变量的线程单独提供独立的变量副本,具有线程隔离效果。
  • 与synchronized的区别
    synchronized 与 TheadLocal都可以实现多线程访问,保证线程安全问题。
    • synchronized 采用当多线程竞争到同一个资源的时候,最终只能够有一个线程访问,采用时间换空间的方式,保证安全问题。
    • TheadLocal 在每个线程中都自己独立的局部变量,空间换时间,相互之间隔离,相比来说TheadLocal效率更高

在这里插入图片描述

二、源码分析

1. 首先看下Thread类

public class Thread implements Runnable {
   
    /* ThreadLocal values pertaining to this thread. This map is maintained
     * by the ThreadLocal class. */
    ThreadLocal.ThreadLocalMap threadLocals = null;
    
  }

Thread中有一个 threadLocals 属性表示线程的本地变量。这个属性的类型是 ThreadLocal.ThreadLocalMap

2. ThreadLocalMap这是什么?

ThreadLocalMapThreadLocal的内部类,他是类 Map结构,并用 Entry封装 K-V。不同的是 ThreadLocalMap的 Entry的 Key只能是 ThreadLocal类型对象,并且是一个弱引用(下面会详细详解)。
在这里插入图片描述
也就是说线程通过一个类Map数据结构ThreadLocal.ThreadLocalMap来存储属于自己的线程变量。

3. ThreadLocal详解

  • ThreadLocal 先对其进行介绍后进行测试。
  • ThreadLocalMap赋值、取值操作的入口在其外部类 ThreadLocal中。
  • 使用时我们只需要操作ThreadLocal即可。
  1. set(T )方法内调用 ThreadLocalMap 的 set(this,v)方法存值。

在这里插入图片描述2. get()方法内调用 ThreadLocalMap的 getEntry(this)方法取值

在这里插入图片描述## 4. 测试

public class TestThreadLocal {

    public static void main(String[] args) {

        ThreadLocal threadLocal = new ThreadLocal();
        threadLocal.set("第一次值");
        threadLocal.set("第二次值");
        System.out.println(threadLocal.get());
       
    }
}

在这里插入图片描述通过set(T)方法可知存储的是当前TheadLocal对象和值,所以新值会替换旧值

三、什么是弱引用呢?

3.1 谈谈引用关系都有哪些,区别又是什么?

  1. 强引用: 当内存不足时,JVM开始进行GC(垃圾回收),对于强引用对象,就算出现OOM(内存溢出)也不会对该对象进行回收

  2. 软引用: 当系统内存充足时,不会被回收,当系统内存不足时会被回收,内存够用就保留,不够用就回收

  3. 弱引用: 比软引用的生存周期更短,只要垃圾回收,不管JVM的内存空间是否够用,都会回收该对象占用的内存空间。

  4. 虚引用: 形同虚设,虚引用不会决定对象的生命周期(主要配合队列,在销毁前做一些操作)。

3.2 ThreadLocal为何使用弱引用

容易被GC回收,对于ThreadLocal而言,为最小化减少内存泄漏的可能性和影响,在ThreadLocal的get,set方法被调用的时候,都会清除线程map里面所有key为null的值。

3.3 内存泄漏是什么,如何避免TheadLocal的内存泄漏?

内存泄漏: 申请了内存,但是该内存一直无法释放,申请内存时,发现内存不足,就会报错OOM问题

如何避免

  • TheadLocal本身会在get,set时清除key为null的值
  • Entry对象本身为弱引用
  • 在使用完该对象时,手动调用remove方法

四、总结

  • Thread用类似 Map的 ThreadLocal.ThreadLocalMap数据结构来存储以 ThreadLocal类型的变量为 Key的数值,并用 ThreadLocal来存取删,操作 ThreadLocalMap
  • 调用 set(T)方法时,就是以当前ThreadLocal变量为 key,传入参数为 value,向 ThreadLocal.ThreadLocalMap存数据
  • 当我们调用 get()方法时,就是以当前 ThreadLocal变量为 key,从 ThreadLocal.ThreadLocalMap取对应的数据
  • 使用完后记得调用remove()方法

在这里插入图片描述在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

并行编程解决什么问题?

多线程爬虫是指通过多个线程并发地请求网页和解析响应,以提高爬虫的效率和速度。在 Python 中可以使用 threading、Queue 和 requests 等模块来实现。 并行编程是一种利用多个处理器/内核/线程来同时执行代码的编程方式。它可以解决以下几个问题: 提升程…

python卸载和安装

python卸载 进入电脑控制面板,点击卸载程序 搜索python,如果之前是安装成功的并且没用安装其它相关软件,应该会出现下图所示的两个,分别点击卸载 等待其卸载完毕 卸载结束 python下载 进入官网鼠标放在downloads下出现选项框后选择对应型号…

静态链接库顺序问题

前言 最近遇到了一个非常奇怪的问题,编译时竟因为链接库的顺序不同,就有完全不同的结果。代码非常简单如下所示: #include "muduo/net/EventLoop.h"int main() {muduo::net::EventLoop loop1;muduo::net::EventLoop loop2;return…

Tomcat之多JAVA环境JVM版本查看及使用优先级

一、前言 业务系统包含PC端和移动端,移动端为微信小程序。在小程序客户端发送消息未得到回应,查询系统后台日志发现报错日志。JDK或者JRE中自带的“local_policy.jar ”和“US_export_policy.jar”是支持128位密钥的加密算法,而当我们要使用2…

Linux开发工具vim篇

文章目录 👇0. 前言👉1.yum软件包管理器👏1.1 yum三板斧👌查看👌安装👌卸载 👏1.2 拓展yum源 👍2. vim编辑器🤏2.1 vim基本概念🤏2.2 vim基本操作&#x1f90…

电路仿真软件LTspice 使用教程

一、LTspice 特点 1、免费 2、电源快速仿真 3、涵盖大量ADI产品模型 二、获取方式 LTspice信息中心 | 亚德诺半导体 如下图所示,根据操作系统,下载对应的安装包安装即可。 软件打开界面如图: 三、运行演示电路 一、官网下载 LTspice演…

一文读懂kubernetes部署:网关部署

部署网关 如您需要创建SSL(HTTPS)站点请先参考SSL证书的创建创建好secret 修改Ingress配置域名 首先我们要先根据域名情况更改ingress配置情况: 非SSL站点 vi/opt/kubernetes/gateway/ingress.yaml SSL站点 创建secret kubectl-nns-javashopcreatesecrettlsxxx-se…

Caffeine本地缓存

1、Caffine简介 简单说,Caffine 是一款高性能的本地缓存组件 由下面三幅图可见:不管在并发读、并发写还是并发读写的场景下,Caffeine 的性能都大幅领先于其他本地开源缓存组件 2、常见的缓存淘汰算法 2.1、FIFO 它是优先淘汰掉最先缓存的数据…

SQL优化的方法

(1)建立物化视图或尽可能减少多表查询。 (2)以不相干子查询替代相干子查询。 (3)只检索需要的列。 (4)用带in的条件子句等价替换or子句。 (5)经常提交com…

如何科学地利用MTTR优化软件交付流程?

谷歌提出的衡量 DevOps 质量的 DORA 指标让 MTTR(平均恢复时间) 名声大振。在本文中,你将了解到 MTTR 的作用、为什么它对行业研究很有用、你可能被它误导的原因以及如何避免 MTTR 产生的弊端。 MTTR 究竟是在测量什么? MTTR …

【服务器】springboot服务端接口公网远程调试 - 实现HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

chatgpt赋能python:Python中如何删除:最全面的教程

Python中如何删除:最全面的教程 在Python编程中,许多情况下需要对数据进行操作,其中一种最基本的操作之一是删除。本文章将是一个关于Python中如何删除的最全面的教程。我们将会介绍Python中删除的概念、各种删除方法、删除前后的注意事项以…

同元自主可控半实物仿真从方案到实践

千寻万觅待花开 在日益激烈的市场竞争环境下,新产品的开发和面世遇到更高的要求和挑战,市场对其可靠性和稳定性的要求也日益提高。完全基于软件仿真的开发过程只实现了系统结构及原理、算法的验证,最终样机硬件系统并未进行仿真测试或者进行仿…

一寸照片的尺寸是多少?证件照尺寸如何修改?

一寸证件照是我们日常生活中非常常用的证件照。无论是办理身份证、驾驶证、护照还是其他证件,都需要提供一寸证件照。一寸证件照是指照片尺寸为2.5cm3.5cm的照片,通常要求符合一定的标准。但是大家在需要使用一寸证件照时,发现自己的证件照尺…

基于微信小程序制作一个记账小工具

你不理财,财不理你,制作一个记账小程序对自己的收入/支出明细进行管理,守护好自己的钱袋子。 一、小程序1.1 项目创建1.2 首页1.3 收支报表页1.4 记账提交页1.5 记账列表页

Transformer升级之路:一种全局长度外推的新思路

©PaperWeekly 原创 作者 | 苏剑林 单位 | 追一科技 研究方向 | NLP、神经网络 说到 Transformer 无法处理超长序列的原因,大家的第一反应通常都是 Self Attention 的二次复杂度。但事实上,即便忽略算力限制,常规的 Transformer 也无法处…

NetApp ONTAP Select 混合云存储解决方案

NetApp ONTAP Select 集敏捷性与经验证的数据管理功能于一体。 为什么选择 ONTAP Select 来实施混合云? -强大而敏捷的存储 既具备 ONTAP 软件的强大功能,也能够灵活地部署在远程办公室/后台位置以及数据中心外部的专用边缘环境中的商用硬件上。ONTAP …

python---逻辑运算符

and 并且 一假则假 or 或者 一真则真 not 逻辑取反 下面举例介绍上面代码的运行情况 运行结果如下: EG: 针对上述情况可以简化代码成如下: 短路操作 左侧为false右侧不在求值

如何使用 Megatron-LM 训练语言模型

在 PyTorch 中训练大语言模型不仅仅是写一个训练循环这么简单。我们通常需要将模型分布在多个设备上,并使用许多优化技术以实现稳定高效的训练。Hugging Face 🤗 Accelerate 的创建是为了支持跨 GPU 和 TPU 的分布式训练,并使其能够非常容易的…

WPS 借助 ML Kit 无缝翻译 43 种语言,每年净省 6,500 万美元

△ 动画说明: 在笔记本电脑屏幕中,汉字 "文" 将变为字母 "A",代表文本的横线将逐一出现,就像有人在输入内容一样。 WPS 是一款办公套件软件,可让用户轻松查看和编辑其所有文档、演示文稿、电子表格等。作为一…