什么是ThreadLocal

1. 什么是ThreadLocal

ThreadLocal 为每一个线程提供独立的局部变量,每个线程都拥有该变量的一个独立副本。 每个Thread里面都有一个ThrealLocal.ThreadLocalMap结构,里面由Entry数组组成。key是ThrealLocal,value是我们存的Object,当我们调用set的时候,就会去当前线程所持有的ThrealLocalMap放入一个k-v对,当我们调用get的时候,会去ThrealLocalMap中,找到当前ThrealLocal对象对应的value返回。

在这里插入图片描述

2. 为什么key采用弱引用

因为被弱引用引用的对象可以在垃圾回收时被回收,避免内存泄露。考虑以下场景:
在线程池中使用ThreadLocal, 线程池中的线程是复用的,线程不会在任务结束后立即销毁,而是继续处理下一个任务。如果 ThreadLocal 变量没有被正确清理,这些变量可能会被下一个任务误用或一直占用内存,导致内存泄露。

代码参考如下:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadLocalMemoryLeakExample {private static final ThreadLocal<byte[]> threadLocal = new ThreadLocal<>();public static void main(String[] args) {ExecutorService executor = Executors.newFixedThreadPool(5);for (int i = 0; i < 100; i++) {executor.submit(() -> {// 设置 ThreadLocal 变量,分配 10MB 的内存threadLocal.set(new byte[10 * 1024 * 1024]);// 模拟任务处理try {Thread.sleep(100);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 不清理 ThreadLocal 变量// threadLocal.remove();});}executor.shutdown();}
}

3. ThreadLocal会有什么问题?

即使 ThreadLocal 对象被垃圾回收了,ThreadLocalMap 中的键变成 null,但其对应的值依然存在,除非显式地清除。这会导致这些值无法被垃圾回收,从而引发内存泄露。所以我们在使用ThreadLocal的时候,一定要手动添加一个remove方法,即可解决内存泄露。

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

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

相关文章

使用yarn/npm安装插件(涉及electron),总是报错证书错误或者ssl解析错误

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、问题描述二、解决措施总结 前言 最近electron更新到了30大版本&#xff0c;里面更新的一个重大变化是主进程增加了 WebContentsView 和 BaseWindow&#xff0c;对窗口的控制会更加丝滑。 正好最近在做把文章或者视频…

2024-简单点-ultralytics库解析-data模块

data模块 overview布局\_\_init__.pyfrom .base import BaseDataset\_\_all__ annotator.pyaugment.pyclass BaseTransformclass Composeclass BaseMixTransformclass Mosaic静态方法更新label class MixUpRandomPerspectiveclass RandomHSV overview布局 从上往下解析 __init…

29、Qt使用上下文菜单(右键菜单)

说明&#xff1a;使用四种方式实现鼠标右击界面&#xff0c;显示出菜单&#xff0c;菜单上有两个动作&#xff0c;选择两个动作&#xff0c;分别打印“111”和“222”。 界面样式如下&#xff1a; 一、方法1&#xff1a;重写鼠标事件mousePressEvent .h中的代码如下&#xff…

C++——超简单登录项目

程序入口文件 #include <QtWidgets/QApplication> // 包含登录页面头文件 #include "DlgLogin.h"int main(int argc, char *argv[]) {QApplication a(argc, argv);// 程序入口// 调页面起来//DlgMain w;//w.show();// 换成登录页面DlgLogin w;w.show();return…

大数据可视化实验(四):Excel数据可视化

目录 一、实验目的... 1 二、实验环境... 1 三、实验内容... 1 1&#xff09;excel函数应用.. 1 2&#xff09;数据透视图绘制... 3 四、总结与心得体会... 5 一、实验目的 1&#xff09;掌握函数和公式的原理 2&#xff09;掌握在单元格或编辑栏中直接输入带函数的公式…

Weblogic未授权远程代码执行漏洞 (CVE-2023-21839)

1 漏洞概述 CVE-2023-21839是一个针对Oracle WebLogic Server的远程代码执行漏洞。WebLogic是美国Oracle公司出品的一个Java应用服务器&#xff0c;用于本地和云端开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用。该漏洞源于WebLogic IIOP/T3协议存在的缺陷&…

ATA-4315高压功率放大器在高频理疗仪驱动中的应用

现代社会&#xff0c;面对生活压力、工作压力&#xff0c;再加上不良的生活习惯&#xff0c;难免身体会出现这样或那样的问题&#xff0c;随着科技的发展&#xff0c;我们除了来到医院进行具体的治疗&#xff0c;一些可以用来辅助医生进行治疗的仪器设备也越来越多的应用到了临…

JSON在线解析及格式化验证 - JSON.cn网站

JSON在线解析及格式化验证 - JSON.cn https://www.json.cn/

5月14(信息差)

&#x1f30d;字节携港大南大升级 LLaVA-NeXT&#xff1a;借 LLaMA-3 和 Qwen-1.5 脱胎换骨&#xff0c;轻松追平 GPT-4V Demo 链接&#xff1a;https://llava-next.lmms-lab.com/ &#x1f384;阿里巴巴开源的15个顶级Java项目 ✨ 欧洲在线订餐服务Takeaway.com&#xff1a…

Token 计费与计算、tiktoken介绍

Token怎么计算的&#xff1f; 每个模型都具有不同的功能和价格。价格是按照每1000个 Token 计算的。您可以将Token视为单词的组成部分&#xff0c;其中1000个Token 大约相当于750个单词。(这段文字包含35个Token) 可以看到35个颜色块 每个块都有ID 英文、中文 都会有单独的一个…

xFormers

文章目录 一、关于 xFormers二、安装 xFormers三、基准测试&#xff08;可选&#xff09;测试安装 四、使用 xFormers1、Transformers 关键概念2、Repo 地图注意力机制Feed forward mechanismsPositional embeddingResidual pathsInitializations 3、主要特征4、安装故障排除 一…

使用Docker创建verdaccio私服

verdaccio官网 1.Docker安装 这边以Ubuntu安装为例Ubuntu 安装Docker​&#xff0c;具体安装方式请根据自己电脑自行搜索。 2.下载verdaccio docker pull verdaccio/verdaccio3.运行verdaccio 运行容器&#xff1a; docker run -it -d --name verdaccio -p 4873:4873 ver…