【Java并发】ThreadLocal的实现原理源码解析

news2025/3/18 16:25:03

文章目录

    • 1.ThreadLocal是什么?
    • 2.ThreadLocald实现原理&源码解析
    • 3.ThreadLocal-内存泄露问题

1.ThreadLocal是什么?

ThreadLocal 是 Java 中的一个线程局部变量类。它提供了一种在多线程环境下,为每个线程独立存储数据的机制。

并且:
ThreadLocal 通过为每个线程创建一个独立的副本来实现线程隔离。每个线程都可以独立地修改和访问自己的副本,而不会影响其他线程的副本。每个线程都可以像访问普通变量一样访问 ThreadLocal 对象,而不必担心线程安全问题。

2.ThreadLocald实现原理&源码解析

ThreadLocal本质来说就是一个·线程内部存储类·,从而让多个线程只操作自己内部的值,从而实现线程数据隔离

基本方法有:

  1. set(value) 设置值
  2. get() 获取值
  3. remove() 清除值

set(value) 设置值
首先获取当前线程,然后获取当前线程的 ThreadLocalMap 对象。如果 ThreadLocalMap 存在,就将当前 ThreadLocal 对象作为,将值 value 存储到其中;否则,创建一个新的 ThreadLocalMap,并将当前 ThreadLocal 对象和值 value 存储到其中。

/**
 * 设置线程局部变量的值。
 * @param value 要设置的值
 */
public void set(T value) {
    // 获取当前线程
    Thread t = Thread.currentThread();
    // 获取当前线程的 ThreadLocalMap,用于存储线程局部变量
    ThreadLocalMap map = getMap(t);
    if (map != null)
        // 如果 ThreadLocalMap 存在,则将当前 ThreadLocal 对象作为键,将 value 作为值存储起来
        map.set(this, value);
    else
        // 如果 ThreadLocalMap 不存在,则创建一个新的 ThreadLocalMap,并将当前 ThreadLocal 对象和 value 存储到其中
        createMap(t, value);
}

get() 获取值

通过ThreadLocal 对象去取对应的value

首先,获取当前线程并获取其对应的 ThreadLocalMap 对象。如果 ThreadLocalMap 存在,则通过调用 getEntry(this) 方法获取当前 ThreadLocal 对象对应的条目。如果条目存在,则返回条目中存储的值。如果线程局部变量不存在,则调用 setInitialValue() 方法返回初始值。

/**
 * 获取线程局部变量的值。
 * @return 线程局部变量的值,如果不存在则返回初始值
 */
public T get() {
    // 获取当前线程
    Thread t = Thread.currentThread();
    // 获取当前线程的 ThreadLocalMap,用于存储线程局部变量
    ThreadLocalMap map = getMap(t);
    if (map != null) {
        // 通过 ThreadLocalMap 获取对应的条目
        ThreadLocalMap.Entry e = map.getEntry(this);
        if (e != null) {
            // 如果条目存在,则返回条目中存储的值
            @SuppressWarnings("unchecked")
            T result = (T)e.value;
            return result;
        }
    }
    // 如果线程局部变量不存在,则返回初始值
    return setInitialValue();
}

remove() 清除值

根据ThreadLocal 删除对

     /**
 * 从当前线程的 ThreadLocalMap 中移除当前 ThreadLocal 对象对应的条目。
 */
public void remove() {
    // 获取当前线程的 ThreadLocalMap
    ThreadLocalMap m = getMap(Thread.currentThread());
    if (m != null) {
        // 如果 ThreadLocalMap 存在,则调用 remove(this) 方法移除当前 ThreadLocal 对象对应的条目
        m.remove(this);
    }
}

3.ThreadLocal-内存泄露问题

什么是内存泄漏
内存泄漏是指在程序中,不再使用的对象仍然被占用着内存无法被垃圾回收器回收释放,导致内存占用逐渐增加,最终可能导致内存耗尽性能下降。

Java对象中的四种引用类型:强引用软引用弱引用虚引用

强引用:最为普通的引用方式,表示一个对象处于有用且必须的状态,如果一个对象具有强引用,则GC并不会回收它。即便堆中内存不足了,宁可出现OOM,也不会对其进行回收

在这里插入图片描述

弱引用:表示一个对象处于可能有用且非必须的状态。在GC线程扫描内存区域时,一旦发现弱引用,就会回收到弱引用相关联的对象。对于弱引用的回收,无关内存区域是否足够,一旦发现则会被回收

在这里插入图片描述
出现内存泄漏的原因:

  1. 长期持有:如果在 ThreadLocal 中设置的值长时间持有,而没有进行及时清理和释放可能导致内存泄漏。(只要线程不结束,就一直存在)

  2. 线程结束不清理:如果在线程结束没有正确地清理 ThreadLocal,可能会导致内存泄漏。因为线程结束后,对应的 ThreadLocalMap 对象不会被垃圾回收,其中的 ThreadLocal 对象无法释放。

  3. 对象强引用:每一个Thread维护一个ThreadLocalMap,在ThreadLocalMap中的Entry对象继承了WeakReference。其中key为使用弱引用的ThreadLocal实例,value为线程变量的副本

在这里插入图片描述
解决办法就是:使用完ThreadLocal后主动 remove 释放 key,value

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

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

相关文章

iptables端口转发,wireshark抓包分析

app发送请求,到安全交互平台访问服务,app发送请求的ip地址是基站随机分配的,ip地址被拉黑了怎么访问?解决办法? 一开始考虑使用nginx作为代理服务器转发请求,后来在服务器用端口转发解决。 修改nginx配置文…

Spark(39):Streaming DataFrame 和 Streaming DataSet 输出

目录 0. 相关文章链接 1. 输出的选项 2. 输出模式(output mode) 2.1. Append 模式(默认) 2.2. Complete 模式 2.3. Update 模式 2.4. 输出模式总结 3. 输出接收器(output sink) 3.1. file sink 3.2. kafka sink 3.2.1. 以 Streaming 方式输出数据 3.2.2. 以 batch …

gin的占位符:和通配符*

1、用法 在 Gin 路由中,可以使用一个通配符(*)或一个占位符(:)来捕获 URL 的一部分。 r.GET("/royal/:id", func(c *gin.Context) {id : c.Param("id")//fmt.Println("into :id")c.Str…

为什么商业基础软件需要开源

Bytebase 本身是一家商业软件公司,而作为最核心资产的代码从 Day 0 却是开源的。同时我们还是 star-history.com 的运营者,大家在各种开源渠道会看到它生成的图: 一直以来,常会被别人问起的一个问题,就是为什么 Byteba…

软件研发的道德情操

作者:许晓斌(晓斌) 两百多年前苏格兰出了一位大哲学家,他的名字叫做亚当斯密。今天人们对他的了解更多是在经济学家这个身份,都认为是他发现了“看不见的手”这一神奇的经济规律,以及他那本著名的《国富论》。然而除了这本书之外&…

一文详解自然语言处理两大任务与代码实战:NLU与NLG

目录 1. 自然语言处理定义NLP的定义和重要性NLP的主要挑战 2. 基础模型语言模型统计语言模型n-gram模型 连续词袋模型 3. 基础概念词向量Word2VecSkip-Gram GloVeFastText1. 子词表示2. 词向量训练3. 文本分类4. 预训练模型 4. 文本预处理分词去除停用词词干提取和词形还原文本…

R语言的物种气候生态位动态量化与分布特征模拟实践技术

在全球气候快速变化的背景下,理解并预测生物种群如何应对气候变化,特别是它们的地理分布如何变化,已经变得至关重要。利用R语言进行物种气候生态位动态量化与分布特征模拟,不仅可以量化描述物种对环境的需求和适应性,预…

2021年09月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字判断 输入一个字符,如何输入的字符是数字,输出yes,否则输出no 输入 一个字符 输出 如何输入的字符是数字,输出yes,否则输出no 样例1输入 样例1输入 5 样例1输出 yes 样例2输入 A 样例2输出 no 下…

工程优化问题之三杆桁架设计研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【UniApp开发小程序】小程序首页(展示商品、商品搜索、商品分类搜索)【后端基于若依管理系统开发】

文章目录 界面效果界面实现工具js页面首页让文字只显示两行路由跳转传递对象将商品分为两列显示使用中划线划掉原价 后端商品controllerservicemappersql 界面效果 【说明】 界面中商品的图片来源于闲鱼,若侵权请联系删除关于商品分类页面的实现,请在我…

JVM——Java 内存区域详解

文章目录 写在前面 (常见面试题)基本问题拓展问题 一 概述二 运行时数据区域2.1 程序计数器2.2 Java 虚拟机栈2.3 本地方法栈2.4 堆2.5 方法区2.5.1 方法区和永久代的关系2.5.2 常用参数2.5.3 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? 2.6 运行时常量池2.7 直…

DP(背包模型)

求方案数初始化总结 二维 1.体积至多是 j f[0][i]1 (0<i<m) 其余为 0 &#xff08;因为体积是至多是j 它可以小于j f[0][0]1 是肯定的 f[0][i] 这当中 i也可以包括0 一定要get到至多 即便不选物品 f[0][i]也是 1 它可以包含f[0][0]) 2.体积恰好是 j f[0][0]1 其余都…

MATLAB | 绘图复刻(十一) | 截断的含散点及误差棒的分组柱状图

hey大家好久不见&#xff0c;本期带来一篇绘图复刻&#xff0c;居然已经出到第11篇了&#xff0c;不知道有朝一日有没有机会破百&#xff0c;本期绘制的是《PNAS》期刊中pnas.2200057120文章的figure03&#xff0c;文章题目为Intranasal delivery of full-length anti-Nogo-A a…

SaaS BI数据可视化工具:免下载安装,登录即分析

之前有人问我&#xff0c;说&#xff1a;“BI数据可视化工具总是要下载安装&#xff0c;过程繁琐&#xff0c;没点IT基础的人也不太搞得定&#xff0c;有没有不用下载安装就能用的数据可视化工具&#xff1f;”答案当然是有的&#xff0c;那就是SaaS BI数据可视化工具。 SaaS …

并发——AQS原理以及AQS同步组件总结

文章目录 1 AQS 简单介绍2 AQS 原理2.1 AQS 原理概览2.2 AQS 对资源的共享方式2.3 AQS 底层使用了模板方法模式 3 Semaphore(信号量)-允许多个线程同时访问4 CountDownLatch &#xff08;倒计时器&#xff09;4.1 CountDownLatch 的两种典型用法4.2 CountDownLatch 的使用示例4…

生信豆芽菜-箱线图使用说明

网站&#xff1a;http://www.sxdyc.com/visualsBoxplot 一、使用方法 1.打开网址&#xff08;http://www.sxdyc.com/singleCollectionTool?href-diff&#xff09;&#xff0c;选择“箱线图”。 准备数据&#xff1a; 第一个文件为特征的表达文件&#xff0c;第一列为样本&am…

机器人CPP编程基础-05完结The End

非常不可思议……之前四篇博文竟然有超过100的阅读量…… 此文此部分终结&#xff0c;没有继续写下去的必要了。 插入一个分享&#xff1a; 编程基础不重要了&#xff0c;只要明确需求&#xff0c;借助AI工具就能完成一个项目。 当然也不是一次成功&#xff0c;工具使用也需要…

PP模块生产过程检验(工序检验)

质量检验是在一些情形下对物料进行检查的一个操作,用于检验物料是否符合标准。 1.常见检验类型: (1)进货检验(Incoming material Quality Check,IQC) (2) 生产过程检验(In Process Quality Check,IQPC) (3) 最终检验/产品检验(Final Quality Check,FQC) (4)出…

【产品应用】一体化步进伺服电机在自动液体处理工作站中的应用

随着工业自动化的快速发展&#xff0c;自动液体处理工作站在医药、食品、化工等领域中发挥着越来越重要的作用。一体化步进伺服电机作为一种高集成的驱动元件&#xff0c;具有高精度、高速度和高稳定性的特点&#xff0c;被广泛应用于自动液体处理工作站中。本文将详细介绍一体…

同源建模-build loop

对于有残基缺失的晶体结构往往采用同源建模的方式补全&#xff0c;但常规的同源建模方法往往造成非缺失区域残基的挪动&#xff0c;有时我们并不想出现这种状况&#xff0c;尤其是涉及到多个截短体拼合的情况&#xff0c;这时就需要用到约束性同源建模的方法&#xff0c;只对缺…