线程变量ThreadLocal用于解决多线程并发时访问共享变量的问题。

ThreadLocal介绍

ThreadLocal叫做线程变量,用于解决多线程并发时访问共享变量的问题。意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。

 所谓的共享变量指的是在堆中的实例、静态属性和数组;对于共享数据的访问受Java的内存模型(JMM)的控制,其模型如下

ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:

因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。
既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。
ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的线程都会初始化一个完全独立的实例副本。ThreadLocal 变量通常被private static修饰。当一个线程结束时,它所使用的所有 ThreadLocal 相对的实例副本都可被回收。

总的来说,ThreadLocal 适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景

下图可以增强理解:
 

ThreadLocal的简单使用 

public class Example {  // 创建一个 ThreadLocal 变量  private static final ThreadLocal<Integer> threadLocal = new ThreadLocal<>();  public static void main(String[] args) {  // 创建两个线程  Thread thread1 = new Thread(() -> {  // 在线程1中设置 ThreadLocal 变量的值  threadLocal.set(1);  System.out.println(Thread.currentThread().getName() + " value: " + threadLocal.get());  });  Thread thread2 = new Thread(() -> {  // 在线程2中设置 ThreadLocal 变量的值  threadLocal.set(2);  System.out.println(Thread.currentThread().getName() + " value: " + threadLocal.get());  });  // 启动线程  thread1.start();  thread2.start();  }  
}

Threadlocal 内存溢出问题

ThreadLocal在Java中广泛用于实现线程本地存储,为每个线程提供一个独立的变量副本。然而,不正确的使用可能会导致内存溢出或其他问题。以下是ThreadLocal可能导致内存溢出的原因及解决方法:

内存泄露原因:ThreadLocalMap是ThreadLocal的内部类,用于存储每个线程的变量副本。在ThreadLocalMap中,key是弱引用,而value是强引用。这意味着当没有外部强引用指向ThreadLocal对象时,它可能会被垃圾回收。但是,由于ThreadLocalMap中的key是弱引用,它们在GC时可能会被回收。如果此时ThreadLocal对象仍然没有被回收,那么ThreadLocalMap中就会出现key为null的Entry。

使用static的ThreadLocal:静态的ThreadLocal会延长其生命周期,可能导致内存泄漏。因为静态的ThreadLocal对象在整个应用程序运行期间都存在,如果不正确地使用它,可能会导致内存泄漏。

未调用get(), set(), remove()方法:如果分配了ThreadLocal对象但不再调用其get(), set(), remove()方法,那么ThreadLocal对象可能不会被回收,从而导致内存泄漏。

解决策略:

为避免内存泄漏,应确保对ThreadLocal的使用后调用remove()方法来清除对应的值和引用。
使用弱引用的key可以帮助ThreadLocal自动清理过期的节点,从而避免内存泄漏。
尽量避免使用静态的ThreadLocal,或者确保在使用后正确清理资源。
总之,要正确使用ThreadLocal并避免内存泄漏,需要了解其内部机制和工作原理,并确保在使用时遵循最佳实践。

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

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

相关文章

如何用生成式人工智能准备和制作吸引人的美食视频?

YouTube是一个全球性的视频分享平台&#xff0c;上面充满了各式各样的内容&#xff0c;其中美食内容因其视觉和味觉上的双重吸引而备受欢迎。作为一个想要进入这个领域的创作者&#xff0c;你需要知道如何准备和制作吸引人的美食视频。以下是一些基本步骤和技巧&#xff1a; 选…

你知道便利店神秘顾客调研开展原因啊吗?

便利店神秘顾客调研的开展原因主要有以下几点&#xff1a; 1、评估服务质量和商品质量&#xff1a;通过神秘顾客的调研&#xff0c;可以客观地评估便利店的服务质量和商品质量&#xff0c;发现存在的问题和不足之处&#xff0c;为便利店提供改进的依据。 2、了解顾客满意度和…

UE4 Niagara 关卡3.4官方案例解析

Texture sampling is only supported on the GPU at the moment.(纹理采样目前仅在GPU上受支持) 效果&#xff1a;textures can be referenced within GPU particle systems。this demo maps a texture to a grid of particles&#xff08;纹理可以在GPU粒子系统中被引用这个演…

git使用教程14-Pycharm版本控制与分支管理

一、版本控制 1、版本控制介绍 &#xff08;1&#xff09;Version Control System 版本控制系统&#xff0c;简称VCS。 &#xff08;2&#xff09;版本控制系统分类&#xff1a; 集中式版本控制工具&#xff1a;SVN 分布式版本控制工具&#xff1a;Git 2、Pycharm 支持的版本…

Windows安装MySQL8.0详细步骤

目录 一、官网下载MySQL二、将压缩包解压到没有中文和空格的目录下三、设置配置文件四、配置环境变量五、安装初始化mysql服务 一、官网下载MySQL 进入MySQL官网&#xff1a;https://downloads.mysql.com/archives/community/&#xff0c;下载 Windows (x86, 64-bit), ZIP Arch…

项目管理中,项目经理如何搞定跨部门沟通与协作?

在项目管理中&#xff0c;跨部门沟通是一项至关重要的任务。项目经理作为项目的核心协调者&#xff0c;需要确保不同部门之间的顺畅沟通&#xff0c;以推动项目的顺利进行。项目经理如何搞定跨部门沟通&#xff1f; 实际案例&#xff1a; 某公司正在开发一款智能家居系统&am…

深入探索Docker数据卷:实现容器持久化存储的完美方案(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Docker入门到精通》 《k8s入门到实战》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 四、Docker数据卷的高级管理 1、数据卷的生命周期管理 2、数据…

学习Android的第二十天

目录 Android Toast 吐司 常量 常用方法 例子 Android Notification 状态栏通知 Notification 的基本布局 扩展布局 Notification ( 状态栏通知 ) 相关的方法 例子&#xff1a; 参考文档 Android AlertDialog 弹出框 Android Dialog 继承图谱 AlertDialog 几种常…

如何做代币分析:以 CRO 币为例

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;Mingfootprint.network 数据源&#xff1a;CRO Token Dashboard &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关…

MySQL数据库主从复制与读写分离(一)

目录 前言 主从复制设置 配置主服务器 1. **编辑配置文件**&#xff1a; 2. **重启MySQL服务**&#xff1a; 3. **创建复制用户**&#xff1a; 4. **记录二进制日志文件位置**&#xff1a; 配置从服务器 1. **编辑配置文件**&#xff1a; 2. **重启MySQL服务**&#x…

【Python】进阶学习:pandas--rename()用法详解

【Python】进阶学习&#xff1a;pandas-- rename()用法详解 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的…

nginx代理minio教程 避坑过的教程 避开SignatureDoesNotMatch

本次教程使用的是单机minio进行演示&#xff0c;集群minio也和这个差不多。 按照这个教程&#xff0c;可以避开nginx代理minio之后&#xff0c;只能访问文件&#xff0c;但是通过预签名url上传文件就会报SignatureDoesNotMatch的坑 暂定如下&#xff1a; 你已经下载好miniom…

Kubernetes operator 零散知识篇【持续更新中】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列零散知识篇&#xff0c;在学习过程中发现 operator开发 有很多零碎的知识&#xff0c;所以单独用一篇文章记录Kubernetes operator学习系列 快捷链接 Kubernetes operator 前置知识…

基于SpringBoot的物业管理系统

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一 、设计说明 1.1 研究…

Springboot 过滤器、拦截器、全局异常处理

Springboot 过滤器、拦截器、全局异常处理 一 过滤器&#xff08;Filter&#xff09; 过滤器是JavaWeb三大组件&#xff08;Servlet&#xff0c;Filter&#xff0c;Listener&#xff09;之一。 Filter可以把对资源的请求拦截下来&#xff0c;从而实现一些功能。 注意&#…

低代码工具APEX的入门使用(未包含安装)

第一次使用APEX是2019年&#xff0c;这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站&#xff0c;这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程&#xff0c;都是用APEX做的。 那一年&#xff0c;我用APEX做了一个CMDB的管理系统。那时候还没有流行…

美摄科技实时语音数字人解决方案

随着科技的飞速发展&#xff0c;数字人技术已经逐渐渗透到我们生活的各个角落。作为数字人技术的先驱者&#xff0c;美摄科技凭借其卓越的实时语音数字人解决方案&#xff0c;正引领着企业步入一个全新的交互时代。 美摄科技的实时语音数字人解决方案&#xff0c;是基于语音和…

为什么在下一个 IT 项目中选择使用 PostgreSQL

在数据库管理系统这个充满活力的领域中&#xff0c;为你的项目选择合适的平台是一项至关重要的决策。面对众多可选项&#xff0c;每个选项都针对特定的需求&#xff0c;做出选择可能会是一项艰巨的任务。这篇博客将概述为什么 PostgreSQL 可能是你正在寻找的关系数据库解决方案…

HCIA-Datacom题库(自己整理分类的)_33_DHCP协议多选【7道题】

1.使用动态主机配置协议DHCP分配IP地址有哪些优点? 可以实现IP地址重复利用 工作量大且不好管理 配置信息发生变化(如DNS),只需要管理员在DHCP服务器上修改,方便统一管理 避免IP地址冲突 2.网络中部署了一台DHCP服务器,但是管理员发现部分主机并没有正确获取到该DHCP服务…

产品说明书模板帮你写好了,快来抄作业

想要写好产品说明书&#xff0c;想在网络上参考&#xff0c;信息繁杂且各有不同&#xff0c;东拼西凑也写不出一个好的产品说明书。这时候&#xff0c;如果有产品说明书模板&#xff0c;不仅可以可以提高工作效率&#xff0c;还能保持产品说明书的一致性、提供参考和指导&#…