Java并发07之ThreadLocal
文章目录
- 1 ThreadLocal原理
- 2 内部结构
- 3 内存泄露问题
- 4 entry的key为什么被设计为弱引用
1 ThreadLocal原理
ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。
ThreadLocal和synchronized对比:
- synchronized采用以时间换空间的方式, 只提供了一份变量,让不同的线程排队访问。ThreadLocal采用以空间换时间的方式, 为每一个线程都提供了一份变量的副本,从而实现同时访问而相不干扰。
- synchronized侧重于多个线程之间访问共享资源的同步。ThreadLocal侧重于多线程中让每个线程之间的数据相互隔离。
2 内部结构
JDK8中ThreadLocal的设计是:每个线程Thread维护一个ThreadLocalMap变量,这个Map的key是ThreadLocal实例本身,value才是真正要存储的值Object。
public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t); // 通过当前线程去获取当前线程维护的ThreadLocalMap(Thread类的成员变量)if (map != null) map.set(this, value); // this是threadLocal对象else createMap(t, value);
}
优点:这样设计之后每个Map存储的Entry数量就会变少。因为之前的存储数量由Thread的数量决定,现在是由ThreadLocal变量的数量决定。在实际运用当中,往往ThreadLocal变量的数量要远少于线程的数量。并且,当线程销毁之后,对应的ThreadLocalMap也会随之销毁,能减少内存的使用。
比如我们在一个线程中声明了两个ThreadLocal对象,Thread内部都是使用一个ThreadLocalMap存放数据的,ThreadLocalMap的key就是ThreadLocal对象,value就是ThreadLocal对象调用set方法设置的值。
3 内存泄露问题

当我们创建一个泛型为User的ThreadLocal对象并set进一个user后,会在虚拟机栈中存在三个对象引用,分别是Thread对象引用、ThreadLocal对象引用和user对象引用,这三个对象引用都指向堆内存的对象。其中thread对象有一个内部类对象ThreadLocalMap,这个map的每一个entry的key是threadlocal对象,value是user对象。因此对于一个entry对象,有ThreadLocalMap的强引用指向它;然后其中entry对象的key,是ThreadLocal对象的弱引;对于其中的value,是user对象的强引用。
static class Entry extends WeakReference<ThreadLocal<?>> {Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}
}
所以,当ThreadLocal对象引用没了,那么ThreadLocal对象就没有被强引用指向了,在垃圾回收的时候,ThreadLocalMap的entry的key会被清理掉,但是value不会被清理掉。这样一来,ThreadLocalMap中就会出现key为null的Entry。
假如我们不做任何措施的话,value永远无法被GC回收,这个时候就可能会产生内存泄露。ThreadLocalMap 实现中已经考虑了这种情况,在调用set()、get()、remove()方法的时候,会清理掉key为null 的记录。使用完 ThreadLocal方法后最好再手动调用remove()方法。
4 entry的key为什么被设计为弱引用
因为ThreadlocalMap是和线程绑定在一起的,如果线程没有被销毁,即使我们已经不会再用某个ThreadLocal对象了,由于这个ThreadLocal对象对应的entry还存在,并且key如果是强引用的话,那么就会一直指向ThreadLocal对象,那么这个对象就一直不会被回收,于是就出现了内存泄漏。
为了避免这种情况,只要将key设置为弱引用,那么当发生GC的时候,就会自动将弱引用给清理掉。也就是说:如果ThreadLocal对象不再使用了,那么虚拟机栈中ThreadLocal对象的强引用就会去掉,那么就剩下entry中key的弱引用指向ThreadLocal对象了,很快这个ThreadLocal对象就会被GC回收掉了。
相关文章:
Java并发07之ThreadLocal
文章目录 1 ThreadLocal原理2 内部结构3 内存泄露问题4 entry的key为什么被设计为弱引用 1 ThreadLocal原理 ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private st…...
【单细胞数据库】癌症单细胞数据库CancerSEA
数据库地址:home (hrbmu.edu.cn) Cite Huating Yuan, Min Yan, Guanxiong Zhang, Wei Liu, Chunyu Deng, Gaoming Liao, Liwen Xu, Tao Luo, Haoteng Yan, Zhilin Long, Aiai Shi, Tingting Zhao, Yun Xiao, Xia Li, CancerSEA: a cancer single-cell state atlas…...
Rsa加解密 + 签名验签
Rsa加解密 概述聚合算法名称(用于创建加密器)基本概念填充方式分块加密 基本使用生成密钥加解密创建加密器设置模式(加密)、公钥对明文加密,并对结果进行Base64编码对以上结果,进行解密 设置模式࿰…...
bugku-web-留言板1
大小写绕过也不行 <ScRipt>ALeRt(“XSS”);</sCRipT> 双写绕过可以 <scscriptript>alert(z)</scscriptript> 改变大小写 在测试过程中,我们可以改变测试语句的大小写来绕过XSS规则: 比如:<script>alert(“xs…...
进程状态的学习
进程状态就是 task_struct 内的一个整数 状态间是可以进行转化的 运行: 每一个框都是进程的task_struct,都有唯一的pcb和pid来标识它的唯一性 让CPU选择一个进程去运行,本质是选择一个进程的PCB去运行,task_struct里一定有内存指…...
Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势)
Vue 2.0->3.0学习笔记(Vue 3 (四)- Composition API 的优势) Composition API 的优势1. Options API 存在的问题2. Composition API 的优势 Composition API 的优势 1. Options API 存在的问题 笔记 使用传统OptionsA…...
close and shutdown?
背景:我们要讲述的是网络编程中常用的两个API: #include <unistd.h> int close(int fd); #include <sys/socket.h> int shutdown(int sockfd, int how); 以及TCP的半连接,半打开。 shutdown函数的行为依赖第二个参数区分…...
PostgreSQL + hasura + Apollo + GraphQL + React + Antd
技术栈 PostgreSQL hasura Apollo GraphQL React Antd 适用于复杂的查询,快速开发 环境安装 安装PostgreSQL hasura,使用docker安装 使用 Docker Compose 部署时,它会同时启动两个容器PostgreSQL和 Hasura GraphQL ,如下 version: "3.6" serv…...
Android笔记【10】
一、前言 学习课程时,对于自己不懂的点的记录。 二、内容 学习一段代码: val drawerState rememberDrawerState(DrawerValue.Closed)val scope rememberCoroutineScope()Scaffold (topBar{TopAppBar(navigationIcon {IconButton(onClick {scope.lau…...
Leetcode打卡:N皇后
执行结果:通过 题目:51 N皇后 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#…...
Linux内核4.14版本——ccf时钟子系统(3)——ccf一些核心结构体
目录 1. struct clk_hw 2. struct clk_ops 3. struct clk_core 4. struct clk_notifier 5. struct clk 6. struct clk_gate 7. struct clk_divider 8. struct clk_mux 9. struct clk_fixed_factor 10. struct clk_fractional_divider 11. struct clk_multiplier 12…...
[Deep Learning] 深度学习中常用函数的整理与介绍(pytorch为例)
文章目录 深度学习中常用函数的整理与介绍常见损失函数1. L2_loss | nn.MSELoss()公式表示:特点:应用:缺点:主要参数:示例用法:注意事项: 2. L1 Loss | nn.L1Loss数学定义:特点&…...
【ETCD】etcd简单入门之单节点部署etcd
etcd 是一个分布式可靠的键值存储系统,用于分布式系统中最关键的数据,主要特点包括: 简单:具有明确的、面向用户的 API(gRPC) 安全:自动 TLS 支持,并可选的客户端证书认证 快速&am…...
Cadence基础语法
03-Cadence基础语法 0 Cadence基础语法入门:流程编排语言的新星 Cadence是由Uber开发的一种领域特定语言(Domain-Specific Language,DSL),专门用于编写可扩展的长时间运行的业务流程。它是Temporal工作流引擎的核心组…...
GAMES101虚拟机使用教程与探讨
写在前面 环境配置请参考作业0的pdf,本文章主要对于配置好环境后怎么使用以及遇到的问题进行探讨(要是有更方便的使用方式欢迎在评论区讨论),自己刚开始用的时候也折腾了好久,希望能为后来学习的小伙伴节约一点工具使…...
王道考研编程题总结
我还在完善中,边复习边完善(这个只是根据我自身总结的) 一、 线性表 1. 结构体 #define MaxSize 40 typedef struct{ElemType data[MaxSize];int length; }SqList 2. 编程题 1. 删除最小值 题意 :从顺序表中删除…...
算法2--滑动窗口
滑动窗口 滑动窗口经典例题长度最小的子数组无重复字符的最长子串[最大连续1的个数 III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)[将 x 减到 0 的最小操作数](https://leetcode.cn/problems/minimum-operations-to-reduce-x-to-zero/description…...
pycharm或conda中配置镜像源
文章目录 1. 为什么要配置镜像源2. pycharm配置2.1使用pip配置国内镜像源2.2 Pycharm中更改镜像源 3.conda配置镜像源3.1 使用conda命令3.2 文件所在位置(进行增删)3.3 conda常用的几个命令 参考文献 1. 为什么要配置镜像源 由于Python在下载包时&#…...
C#基础之方法
文章目录 1 方法1.1 定义方法1.2 参数传递1.2.1 按值传递参数1.2.2 按引用传递参数1.2.3 按输出传递参数1.2.4 可变参数 params1.2.5 具名参数1.2.6 可选参数 1.3 匿名方法1.3.1 Lambda 表达式1.3.1.1 定义1.3.1.2 常用类型1.3.1.3 Lambda 表达式与 LINQ1.3.1.4 Lambda 表达式的…...
JVM 性能调优 -- JVM常用调优工具【jps、jstack、jmap、jstats 命令】
前言: 前面我们分析怎么去预估系统资源,怎么去设置 JVM 参数以及怎么去看 GC 日志,本篇我们分享一些常用的 JVM 调优工具,我们在进行 JVM 调优的时候,通常需要借助一些工具来对系统的进行相关分析,从而确定…...
League-Toolkit:英雄联盟智能辅助工具的效率提升之道
League-Toolkit:英雄联盟智能辅助工具的效率提升之道 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是…...
AI核心概念串联
目录一、Tokenizer二、LLM三、Context四、RAG五、Prompt六、Tool七、MCP八、Agent九、Skill原UP主视频:从 LLM 到 Agent Skill,一期视频带你打通底层逻辑! 一、Tokenizer 用户每次输入都是一串连续的句子,而LLM的最小单位是toke…...
League Akari:终极英雄联盟自动化工具集——提升90%游戏效率的完整指南
League Akari:终极英雄联盟自动化工具集——提升90%游戏效率的完整指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit …...
vLLM-v0.17.1入门必看:从零部署支持多LoRA的开源推理框架
vLLM-v0.17.1入门必看:从零部署支持多LoRA的开源推理框架 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库,最新发布的v0.17.1版本带来了多项重要改进,特别是增强了对多LoRA适配器的支持。这个开源项目最初由加州…...
无公网IP解决方案:OpenClaw+nanobot内网穿透配置
无公网IP解决方案:OpenClawnanobot内网穿透配置 1. 为什么需要内网穿透? 去年我在尝试将OpenClaw接入家庭NAS时遇到了一个典型问题:没有公网IP。这意味着我无法在外网直接访问部署在家里的nanobot服务。经过多次尝试,最终通过内…...
5步打造企业级数字人创作平台:从本地化部署到场景落地全指南
5步打造企业级数字人创作平台:从本地化部署到场景落地全指南 【免费下载链接】Duix-Avatar 项目地址: https://gitcode.com/GitHub_Trending/he/Duix-Avatar 一、价值定位:数字人技术的企业级应用价值 核心价值:Duix.Avatar通过全本…...
RVC 技术指南:从问题解决到效率提升
RVC 技术指南:从问题解决到效率提升 【免费下载链接】rvc RVC is a Linux console UI for vSphere, built on the RbVmomi bindings to the vSphere API. 项目地址: https://gitcode.com/gh_mirrors/rvc/rvc 问题场景→核心原理→分步方案→进阶技巧 一、环…...
生成式AI欺诈来袭,什么样的IP数据接口才能筑起防线?
某电商平台的风控系统发出预警:一个“新用户”正在批量下单高价商品,收货地址遍布全国,支付方式各不相同。但奇怪的是,这些订单的浏览行为、停留时间、点击轨迹几乎完全一致——这不是真人,而是生成式AI模拟的虚假用户…...
从游戏报错到完美运行 DirectX修复工具实际应用案例展示
评价一款工具软件的优劣,最具有说服力的方式莫过于通过真实的实际案例来直观展示其效果和价值。 对于系统修复类工具来说,更是如此,因为用户最关心的就是它能否真正解决自己的问题。 DirectX相关问题一直是Windows游戏玩家最常遇到的技术难题…...
狗狗6种行为识别检测数据集(近3000张图片已标注)| YOLO训练数据集 AI视觉检测
狗狗6种行为识别检测数据集(近3000张图片已标注)| YOLO训练数据集 AI视觉检测 摘要 在AI视觉落地宠物经济的浪潮中,狗狗行为识别一直是一个非常有商业价值和趣味性的方向。为了帮助大家更高效地训练模型,我整理并开源了一套高质…...
