做动态网站/怎么做电商平台

做动态网站,怎么做电商平台,深圳宣传片制作设计,贵州有网站的企业在 Java 多线程编程的世界里,ThreadLocal 是一个非常实用的工具,它为每个线程提供了独立的变量副本,避免了多线程环境下的变量共享问题。今天,我们就从内存视角出发,通过一张图来深入理解 ThreadLocal 的工作原理&…

在 Java 多线程编程的世界里,ThreadLocal 是一个非常实用的工具,它为每个线程提供了独立的变量副本,避免了多线程环境下的变量共享问题。今天,我们就从内存视角出发,通过一张图来深入理解 ThreadLocal 的工作原理,同时探讨与之相关的内存管理问题。

一、从图中看懂 ThreadLocal 的内存布局

先来看这张图,它清晰地展示了 ThreadLocal 在 Java 内存模型中的工作原理。
在这里插入图片描述

栈与堆的交互
图的左侧是栈区域,右侧是堆内存区域。栈中存储着局部变量,比如 threadLocal1、threadLocal2 等 ThreadLocal 类型的变量,以及 thread1 和 thread2 这样的线程对象引用。这些变量通过强引用(黑色实线箭头)指向堆内存中的对象。

堆内存中,ThreadLocal 对象(如 threadLocal1对象、threadLocal2对象 等)被栈上的变量引用。同时,每个线程对象(thread1对象、thread2对象)内部都有一个 ThreadLocalMap,它是 ThreadLocal 实现线程本地存储的关键。
ThreadLocalMap 的结构
ThreadLocalMap 是一个类似于哈希表的结构,它以数组(Entry[])的形式存储键值对。其中,key 是 ThreadLocal 对象,并且是以弱引用(虚线箭头)的形式存在,value 则是线程本地变量。例如,key11 对应 val11,key21 对应 val21 等。每个 value 又指向实际存储的数据对象,如 obj11、obj21 等。

二、ThreadLocal 与内存管理

弱引用的设计初衷
ThreadLocalMap 中 key 使用弱引用的设计,主要是为了降低ThreadLocal对象内存泄漏的风险。
如下图所示,假设 key11 是强引用,当外部对 ThreadLocal1 对象的强引用被释放后,由于 ThreadLocalMap2 仍然持有 ThreadLocal 1对象的强引用,
这个 ThreadLocal1对象就无法被垃圾回收,从而可能导致内存泄漏。
而使用弱引用,当外部强引用消失后,在下一次垃圾回收时,ThreadLocal1对象就可以被回收。
尽管此时 ThreadLocalMap2 中对应的 Entry 仍然存在,但 key 会变为 null。

在这里插入图片描述
潜在的Entry对象内存泄漏风险
然而,仅仅使用弱引用并不能完全杜绝内存泄漏的问题。如果线程一直存活,并且 ThreadLocal 1对象的 key 变为 null 后,没有及时清理对应的 Entry,那么这些 Entry 就会一直占用内存,随着时间的推移,可能会导致内存占用不断增加。

解决方案:手动清除
为了避免内存泄漏,我们需要在合适的地方调用 ThreadLocal 的 remove 方法。这个方法会清除 ThreadLocalMap 中与当前 ThreadLocal 对象对应的 Entry。例如,在一个方法中使用了 ThreadLocal,在方法结束前,应该调用 remove 方法,确保资源得到及时释放。

ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
try {threadLocal.set(10);// 使用 threadLocalSystem.out.println(threadLocal.get());
} finally {// 手动移除threadLocal.remove();
}

三、实际应用场景

线程上下文信息传递
在一些复杂的业务场景中,我们可能需要在多个方法之间传递线程上下文信息,比如用户身份信息、请求编号等。ThreadLocal 可以方便地实现这一点,每个线程都可以独立地设置和获取这些上下文信息。

public class RequestContext {private static final ThreadLocal<String> requestIdThreadLocal = new ThreadLocal<>();public static void setRequestId(String requestId) {requestIdThreadLocal.set(requestId);}public static String getRequestId() {return requestIdThreadLocal.get();}public static void clearRequestId() {requestIdThreadLocal.remove();}
}

四、总结

通过对 ThreadLocal 内存原理的深入分析,我们了解了它的工作机制以及可能存在的内存管理问题。合理使用 ThreadLocal,并注意内存泄漏的防范,可以让我们在多线程编程中更加得心应手。
希望今天的分享能帮助你更好地理解和应用 ThreadLocal,在实际项目中发挥它的强大作用。

如果你对 ThreadLocal 还有其他疑问,或者在多线程编程中遇到了其他问题,欢迎在留言区交流讨论。

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

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

相关文章

Sql Server 索引性能优化 分析以及分表

定位需优化语句 根据工具 skywking 或者开启慢查询日志 找到 慢sql 的语句根据 执行过程 来 判断 慢的原因 row filter 指标 看查了多少数据 比例多少 type 看下是单表 还是 join联表 比如 执行步骤多 没索引 优化方向 减少执行次数索引 没索引考虑加索引 加索引 尽量选择 i…

@JsonSerialize注解

1.简介 JsonSerialize注解可以自定义改变返回前端的内容,比如:将Student实体类的age字段的值在返回前端之前,由20改为21. 要用到jackson-databind依赖包,在Spring Boot项目中&#xff0c;默认已经集成了Jackson&#xff0c;因此你不需要手动引入Jackson库。 2.上例子 将Stud…

vim的一般操作(分屏操作) 和 Makefile 和 gdb

目录 一. vim的基本概念 二. vim基础操作 2.1 插入模式 aio 2.2 [插入模式]切换至[正常模式] Esc 2.3[正常模式]切换至[末行模式] shift ; 2.4 替换模式 Shift R 2.5 视图&#xff08;可视&#xff09;模式 (可以快速 删除//注释 或者 增加//注释) ctrl v 三&…

Linux:基础IO---文件描述符

文章目录 1. 前言1.1 C语言文件知识回顾 2. 文件2.1 文件基础知识 3. 被打开的文件3.1 以C语言为主&#xff0c;先回忆一下C文件接口3.2 过渡到系统&#xff0c;认识文件系统调用3.3 访问文件的本质3.4 重定向&&缓冲区 序&#xff1a;在深入了解了进程的内容后&#xf…

JDK 24 发布,新特性解读!

一、版本演进与技术格局新动向 北京时间3月20日&#xff0c;Oracle正式发布Java SE 24。作为继Java 21之后的第三个非LTS版本&#xff0c;其技术革新力度远超预期——共集成24项JEP提案&#xff0c;相当于Java 22&#xff08;12项&#xff09;与Java 23&#xff08;12项&#…

批量图片压缩工具,高效减小文件大小并保持质量

在处理大量图片时&#xff0c;如何高效压缩文件大小并保持画质是个常见难题。今天为大家推荐一款专业工具——JPGC&#xff0c;它专为图片批量处理设计&#xff0c;能快速压缩JPG/JPEG格式图片&#xff0c;在减小文件体积的同时尽可能保留画质&#xff0c;尤其适合处理数码相机…

软考中级-软件设计师 准备

软考中级-软件设计师 准备 一、软考相关1.1、考试时间1.2、考试时长1.3、题型和分值&#xff1a; 二、软考备考2.1、相关书籍2.2、推荐课程&#xff1a;B站up主zst_20012.3、学习路线 一、软考相关 1.1、考试时间 一年有两次软考&#xff0c;一般是五月末和十一月的中旬 以下…

【数据挖掘】Python基础环境安装配置

【数据挖掘】Python基础环境安装配置 一、摘要二、安装Python3.13.2三、安装Jupyter Notebook四、安装Numpy和Pandas以及matplotlib五、安装scikit-learn库和seaborn库 一、摘要 本文主要介绍如何在Windows上安装Python3.13.2&#xff0c;然后基于该Python版本安装Jupyter not…

OpenLayers集成天地图服务开发指南

以下是一份面向GIS初学者的OpenLayers开发详细教程&#xff0c;深度解析代码&#xff1a; 一、开发环境搭建 1.1 OpenLayers库引入 <!-- 使用CDN引入最新版OpenLayers --> <link rel"stylesheet" href"https://cdn.jsdelivr.net/npm/ollatest/ol.c…

【免费】2000-2019年各省地方财政房产税数据

2000-2019年各省地方财政房产税数据 1、时间&#xff1a;2000-2019年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地方财政房产税 4、范围&#xff1a;31省 5、指标说明&#xff1a;房产税是对个人和单位拥有的房产征收的一种…

使用Python将视频转化为gif

使用Python将视频转化为gif 一、前言二、准备三、测试 一、前言 最近想把喜欢的视频片段作成gif&#xff0c;就试着用Python做了下&#xff0c;感觉效果还行&#xff0c;这里做个记录。 二、准备 先下载安装对应的库&#xff0c;命令如下&#xff1a; pip install moviepy …

SPI 机制与 Spring Boot AutoConfiguration 对比解析

一、架构效率革命性提升 1.1 类加载效率跃升 Spring Boot 2.7引入的AutoConfiguration.imports采用清单式配置加载&#xff0c;对比传统SPI机制&#xff1a; 传统SPI扫描路径&#xff1a;META-INF/services/** Spring Boot新方案&#xff1a;META-INF/spring/org.springfram…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的异常处理:全局异常与自定义异常

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

moveit2基础教程上手-使用xarm6演示

0、前置信息 开发环境&#xff1a;wsl。 ros版本&#xff1a;jazzy&#xff0c;ubuntu版本&#xff1a;24.04 xarm-ros2地址 1、启动Rviz&#xff0c;加载 Motion Planning Plugin&#xff0c;实现演示功能 Getting Started — MoveIt Documentation: Rolling documentation…

第十六届蓝桥杯模拟二

由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…

晶鑫股份迈向敏捷BI之路,永洪科技助力启程

数据驱动的时代&#xff0c;每一次技术的创新和突破都在为企业的发展注入新的动力。而敏捷性也不再是选择&#xff0c;是企业生存与发展的必要条件。作为连续5年获得中国敏捷BI第一名的永洪科技&#xff0c;通过不断地在数据技术领域深耕细作&#xff0c;再次迎来了行业内的关注…

基于CAMEL 的Workforce 实现多智能体协同工作系统

文章目录 一、workforce 简介1.架构设计2.通信机制 二、workforce 工作流程图示例1.用户角色2.工作流程 三、workforce 中重要函数说明1.__init__函数2.add_single_agent_worker 函数3.add_role_playing_worker 函数4.add_workforce 函数 四、基于workforce实现多智能体协调&am…

每日一题力扣2974.最小数字游戏c++

2974. 最小数字游戏 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…

Adobe After Effects 操作

Adobe After Effects &#xff08;AE&#xff09;可以实现将多个元素进行合成&#xff0c;实现特殊效果。AE的项目文件是aep&#xff0c;可以将素材、层、效果等一切信息&#xff0c;保存在这个项目文件中。 AE的原理&#xff0c;和PS的原理非常类似。 操作界面 操作界面如…

【React】基于自定义Hook提取公共逻辑

目录 自定义Hook自定义Hook 1自定义Hook 2使用 注意事项 自定义Hook 作用&#xff1a;提取封装一些公共的处理逻辑 玩法&#xff1a;创建一个函数&#xff0c;名字需要是 useXxx &#xff0c;后期就可以在组件中调用这个方法&#xff01; 自定义Hook 1 页面加载的时候修改浏…