ThreadLocal与ThreadLocalMap

news2025/1/25 9:11:35

参考:理清ThreadLocal、ThreadLocalMap、Thread之间的关系 - 翎野君 - 博客园 (cnblogs.com)

img

ThreadLocalMapThreadLocal 类中的一个静态内部类,但它存在于每个线程的 Thread 对象内部,而不是 ThreadLocal 实例本身。

  • ThreadLocal:这是一个顶级类,用于定义线程局部变量。每个 ThreadLocal 实例表示一个特定类型的线程局部变量。
  • ThreadLocalMap:这是 ThreadLocal 类中的一个静态内部类,它提供了一种数据结构来存储每个线程的 ThreadLocal 实例及其对应的值。ThreadLocalMap 不是 ThreadLocal 的成员,而是存在于每个线程的内部。ThreadLocalMap中 key是ThreadLocal实例
  • 线程对象:每个 Thread 对象都有一个 ThreadLocalMap 成员变量(实际字段名为 threadLocals),用于存储该线程所有 ThreadLocal 实例的值。

当一个线程访问一个 ThreadLocal 变量时,ThreadLocalget() 方法会查找当前线程的 ThreadLocalMap,然后在这个 ThreadLocalMap 中查找与当前 ThreadLocal 实例相对应的值。同理,ThreadLocalset() 方法也会在当前线程的 ThreadLocalMap 中设置或更新一个值。

静态内部类的特点如下:

  1. 不依赖于外部类实例:与非静态内部类(也称为成员内部类)不同,静态内部类不需要外部类的实例即可创建。这意味着你可以直接通过外部类的名称来创建静态内部类的实例,而不需要先实例化外部类。

  2. 访问限制:静态内部类可以访问外部类的静态成员(包括静态变量和静态方法),但不能直接访问外部类的实例成员,除非你有一个外部类的实例。这是因为静态内部类没有隐含的对外部类实例的引用。

  3. 作用域和命名:静态内部类在语法上与顶级类相似,可以像顶级类那样自由地使用,而不会与外部类的实例产生任何联系。它有自己的作用域,可以有与外部类相同的成员名称而不会发生冲突。

  4. 实例化:静态内部类的实例化与顶级类类似,可以直接使用 new 关键字加上类名来创建。例如,如果你有一个名为 OuterClass 的类,其中包含一个静态内部类 InnerClass,你可以这样创建 InnerClass 的实例:

    Java深色版本

    1OuterClass.InnerClass innerInstance = new OuterClass.InnerClass();
    
  5. 静态变量和方法:静态内部类可以有静态成员,就像顶级类一样。这些静态成员同样可以在不实例化静态内部类的情况下访问。

  6. 继承与接口实现:静态内部类可以继承其他类或实现接口,与顶级类没有区别。

package org.example;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadLocalExample {

    // 创建一个 ThreadLocal 对象,它将存储 String 类型的数据
    private static final ThreadLocal<Integer> threadLocalData = new ThreadLocal<>();

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);

        // 提交第一个任务到线程池
        executorService.submit(() -> {
            if (threadLocalData.get() == null) {
                threadLocalData.set(0);
            }
            threadLocalData.set(threadLocalData.get() + 1);
            System.out.println("Thread 1: " + Thread.currentThread().getName());
            System.out.println("Thread 1 data: " + threadLocalData.get());
        });

        // 提交第二个任务到线程池
        executorService.submit(() -> {
            if (threadLocalData.get() == null) {
                threadLocalData.set(0);
            }
            threadLocalData.set(threadLocalData.get() + 1);
            System.out.println("Thread 2: " + Thread.currentThread().getName());
            System.out.println("Thread 2 data: " + threadLocalData.get());
        });

        // 关闭线程池
        executorService.shutdown();
    }
}

//输出为:
//Thread 1: pool-1-thread-1
//Thread 2: pool-1-thread-2
//Thread 1 data: 1
//Thread 2 data: 1

每个任务都会设置 threadLocalData 的值,并打印出当前线程的名字和线程局部变量的值。因为 ThreadLocal 保证了每个线程都有其独立的变量副本,所以即使多个线程共享同一个 ThreadLocal 实例,它们之间的变量值也是隔离的。

内存泄漏问题:
在这里插入图片描述
参考:【面试进阶之路】这次彻底说明白 ThreadLocal 内存泄漏问题_theallocal 内存泄露-CSDN博客

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

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

相关文章

怎么压缩视频?推荐7款必备视频压缩软件免费版(强烈建议收藏)

如今&#xff0c;视频内容日益丰富&#xff0c;并占据了许多人的日常娱乐和工作生活。然而&#xff0c;随着高清和超高清视频的普及&#xff0c;视频文件的体积也越来越大&#xff0c;给存储和传输带来了挑战。因此&#xff0c;学会如何压缩视频文件成为了许多人的需求之一。本…

Spring Web MVC入门(1)(建立连接)

一.什么是Spring Web MVC? Spring Web MVC是基于ServletAPI构建的原始Web框架,从一开始就包含在Spring框架中.它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC". 二.MVC的定义 MVC是Model View Controller的缩…

[终端安全]-7 后量子密码算法

本文参考资料来源&#xff1a;NSA Releases Future Quantum-Resistant (QR) Algorithm Requirements for National Security Systems > National Security Agency/Central Security Service > Article Commercial National Security Algorithm Suite 2.0” (CNSA 2.0) C…

高性价比之战,希喂、霍尼韦尔、安德迈宠物空气净化器真实PK

在拥有孕妇与小孩的家庭中饲养宠物&#xff0c;营造一个既温馨又健康的居家环境显得尤为重要。尽管日常的打扫与清洁工作已做得相当到位&#xff0c;但空气中仍难免悬浮着细微的宠物浮毛与不易察觉的异味&#xff0c;这些长期累积下来&#xff0c;极易成为细菌滋生的温床&#…

双一流高校某教学系统存在多个高危漏洞

脆弱资产搜集 信息搜集过程中&#xff0c;除了用常见子域名扫一遍&#xff0c;还可以通过空间搜索引擎手动搜索。我用的就是把学校名称或者缩写作为关键字&#xff0c;利用语法: web.body“关键字”&&web.body“系统” web.body“关键字”&&web.body“登录”…

05:定时器中断

中断 1、定时器T0中断2、案例&#xff1a;通过定时器T0中断来实现灯间隔1s亮灭 1、当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求&#xff0c;要求CPU暂停当前的工作&#xff0c;转而去处理这个紧急事件&#xff0c;处理完以后&#xff0c;再回到原来被中断的地方…

基于红黑树对map和set的封装

前言 前面我们已经对红黑树做了介绍和实现&#xff0c;本期我们来对红黑树进一步改造&#xff0c;然后基于改造后的红黑树封装出map和set&#xff01; 本期内容介绍 • 红黑树的改造 • 红黑树的迭代器实现 • map的封装 • set的封装 • 全部源码 ● 红黑树的改造 我们目前…

小程序项目记录

写小程序遇到的问题&#xff1a; 1、如何发行小程序 第一步点击“发行” 然后选择“小程序-微信(仅适用于uni-app)” 然后会弹出一个这样的框 微信小程序名称和AppId会自动带入 然后控制台会出现这些信息 注意&#xff1a;生成的这个路径build为线上环境部署所使用路径&…

Hydra-MDP: 端到端多模态规划与多目标 Hydra 蒸馏

Hydra-MDP: End-to-end Multimodal Planning with Multi-target Hydra-Distillation Hydra-MDP: 端到端多模态规划与多目标 Hydra 蒸馏 Abstract We propose Hydra-MDP, a novel paradigm employing multiple teachers in a teacher-student model. This approach uses know…

音质强者悠律Ringbuds pro,时尚与音质并存

首次将手机使用的“素皮”材料用在充电仓的设计上&#xff0c;不仅手感好&#xff0c;质感直接拉满&#xff0c;而这样的工业设计不仅获得了很多消费者的喜爱&#xff0c;同时也荣获了世界知名的红点设计大奖&#xff0c;此奖项并一直被冠以“国际工业设计的奥斯卡”之称。可见…

Android 使用 Debug.startMethodTracing 分析方法耗时

参考 Generate Trace Logs by Instrumenting Your App 官网提供了 trace 工具来分析方法耗时。 生成 trace 文件 package com.test.luodemo.trace;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle; import android.os.Debug; import android.uti…

从点击到转化,Xinstall解析移动广告全链路数据,优化ROI的秘密

在疫情的持续影响下&#xff0c;全球营销环境正经历着前所未有的变革。品牌广告主们面对挑战&#xff0c;展现出前所未有的积极与韧性。移动端广告投放的持续增长&#xff0c;尤其是短视频和图文广告的兴起&#xff0c;为品牌带来了新的机遇。然而&#xff0c;如何在激烈的市场…

Dify 与 Xinference 最佳组合 GPU 环境部署全流程

背景介绍 在前一篇文章 RAG 项目对比 之后&#xff0c;确定 Dify 目前最合适的 RAG 框架。本次就尝试在本地 GPU 设备上部署 Dify 服务。 Dify 是将模型的加载独立出去的&#xff0c;因此需要选择合适的模型加载框架。调研一番之后选择了 Xinference&#xff0c;理由如下&…

【PostgreSQL】Spring boot + Mybatis-plus + PostgreSQL 处理json类型情况

Spring boot Mybatis-plus PostgreSQL 处理json类型情况 一、前言二、技术栈三、背景分析四、方案分析4.1 在PostgreSQL 数据库中直接存储 json 对象4.2 在PostgreSQL 数据库中存储 json 字符串 五、自定义类型处理器5.1 定义类型处理器5.2 使用自定义类型处理器 一、前言 在…

微信闪退怎么回事?实用技巧助你轻松应对

在使用微信的过程中&#xff0c;偶尔会遇到闪退的问题&#xff0c;这不仅影响我们的日常沟通&#xff0c;还可能导致重要信息的丢失。那么&#xff0c;微信闪退怎么回事呢&#xff1f;闪退的原因可能有很多&#xff0c;包括软件问题、手机存储不足、系统不兼容等。本文将详细分…

好用的IP反查接口(2)

IP-地理信息查询接口-本地化 参考&#xff1a; 通过Ip查询对应地址,Ip2location全球IP地址网段-CSDN博客 因为在线接口有限制&#xff08;毕竟别人提供服务&#xff0c;服务器&#xff0c;数据维护&#xff0c;域名啥的都要费用&#xff09;&#xff0c; 所以本地化服务的需…

vue2学习笔记-官网使用指南和搭建开发环境

官网使用指南 官网地址&#xff1a;介绍 — Vue.js 1、学习 1.1 教程和API 最重要的两个板块。API是VUE的字典&#xff0c;需要时来查阅。 1.2、风格指南 如何写出风格优雅的VUE代码。规则分为四类&#xff1a;必要的&#xff0c;强烈推荐、推荐、谨慎使用。 1.3、示例 …

C嘎嘎类与对象上篇

类的定义 1. class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后⾯分号不能省略 。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。 2. C中struct也可以…

C++入门基础题:数组元素逆序(C++版互换方式)

1.题目&#xff1a; 数组元素逆置案例描述: 请声明一个5个元素的数组&#xff0c;并且将元素逆置. (如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1) 2.图解思路&#xff1a; 3.代码演示&#xff1a; #include<iostream>using namespace std;int main(){int a…

为什么使用代理IP无法访问网站

代理IP可以为用户在访问网站时提供更多的便利性和匿名性&#xff0c;但有时用户使用代理IP后可能会遇到无法访问目标网站的问题。这可能会导致用户无法完成所需的业务要求&#xff0c;给用户带来麻烦。使用代理IP时&#xff0c;您可能会因为各种原因而无法访问您的网站。以下是…