Java多线程学习之ThreadLocal类的简单理解

【Java 多线程 3】理解ThreadLocal 一、基本介绍 经过一宿的面壁思过,下文写的对ThreadLocal的源码分析,过于枯燥乏味,现在简单的总结一下ThreadLocal,提高一下做人的level。 ThreadLocal的作用就是:线程安全。 ThreadLocal的本质就是一个内部的静态的map,key是当前线程的句柄,value是需要保持的值。 由于是内部静态map,不提供遍历和查询的接口,每个线程只能获取自己线程的value。 这样,就线程安全了,又提供了数据共享的能力,perfect。 二、ThreadLocal的应用 阅读详情

ThreadLocal提供了线程本地变量,当创建一个ThreadLocal变量后,每个线程访问ThreadLocal变量的时候访问的都是自己线程中的变量,而不是共享变量。

1  ThreadLocal类的使用

先看一个例子

public class TestThreadLocals {
	
	static ThreadLocal<String> local = new ThreadLocal<>();
	
	public static void main(String[] args) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// 线程1中设置ThreadLocal变量
				local.set("thread-1 local variable");
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("thread-1: " + local.get());
				
			}
		}).start();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				//local.set("thread-2 local variable");
				System.out.println("thread-2: " + local.get());
				
			}
		}).start();
	}	
}

线程1先将local变量设置为“thread-1 local variable” ,让出CPU,线程2中获取local变量

输出结果:  可见线程2中local变量并没有改变

 

将注释行//local.set("thread-2 local variable");的注释去掉后,输出结果,两个线程内设置local互不影响

 

2  ThreadLocal的实现原理

ThreadLocal的类图

Thread类中有两个成员变量 threadLocals和 inheritableThreadLocals, 它们都是ThreadLocalMap类型的,ThreadLocalMap是ThreadLocal的一个静态内部类,作用和hashmap差不多,用于存放某个线程中的ThreadLocal变量以及对应的变量值,因此可以说明一个线程可以具有多个ThreadLocal变量。

2.1 ThreadLocal变量值是如何被存放到线程中的

set(T)方法

首先获取当前线程,通过getMap方法获取Thread对象中的threadLocals映射表,如果threadLocals存在,将ThreadLocal对象作为key,对应的值作为value存入该映射表中。否则,创建线程的threadLocals变量。

由此可见,ThreadLocal只是一个工具壳,它通过操作Thread的成员变量将value的值存入线程。

T get()方法

get方法基本同理,通过当前线程获取线程的threadLocals映射表,从映射表中查找是否存在key = this的项,有则返回,没有的话就返回一个空值

 

3  ThreadLocal可能引起内存泄露

每个线程的本地变量存放在线程自己的内存变量 threadLocals 中,如果当前线程一直不消亡 , 那么这些本地变量会一直存在 , 所以可能会造成内存溢出 , 因此使用完毕后要记得调用 ThreadLocal 的 remove 方法删 除对应线程的 threadLocals 中的本地变量


 

java多线程应用 引 线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。 一个标准线程的构成包括以下四个部分: 线程的ID; 当前指令指针(PC); 寄存器集合; 堆栈组成。 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的... 阅读详情

相关推荐

别再迷信Intel网卡了!用普通笔记本+TWINCAT3搭建EtherCAT主站的完整避坑实录

本文详细介绍了如何用普通笔记本和TWINCAT3搭建EtherCAT主站的完整避坑指南。通过破除必须使用Intel网卡的迷思,提供软件环境搭建、关键配置步骤、Wireshark抓包技巧及性能优化建议,帮助开发者低成本实现EtherCAT主站功能。

weixin_29305337的博客 704

01入门-ThreadLocal详解-并发编程(Java)

01入门-ThreadLocal详解-并发编程(Java)

gaogzhen的博客 478

手把手教你配置MAX96712解串器:从I2C地址分配到PWM帧同步

本文详细解析了MAX96712解串器在自动驾驶视觉链路中的核心配置流程。从I2C地址分配、GMSL2数据流映射到实现多摄像头精准同步的PWM帧同步触发,手把手指导工程师构建高可靠性的图像传输系统,并提供了实用的Linux调试技巧与问题排查思路。

weixin_29297127的博客 921

水滴石穿--多线程原子操作、threadlocal、volatile、多线程下的单例模式

接着上一篇文章,下面看看几个比较好理解的知识点!! volatile java关键字volatile修饰的变量从字面意义上理解易变的,不稳定的,事实上时告诉编译器该变量是易变的不要对该变量使用缓存等级的优化,每次都从内存地址中读取值。 不过并没有说明在对volatile修饰的变量进行修改后立即写会内存地址,也就是说volatile只提供内存的可见性,而没有提供原子性,所以在高并发下是不安全的...

weixin_40657079的博客 481

避坑指南:锐浪报表PictureBox打印图像常见的5大问题及解决方案

本文深入剖析了锐浪报表(Grid++Report)中PictureBox控件打印图像时常见的五大难题,包括图像源加载机制、拉伸失真、动态加载失败、跨平台兼容性及性能优化。文章提供了从原理理解到实战解决方案的完整指南,帮助开发者有效规避图像打印中的常见陷阱,确保报表输出的稳定与高质量。

water的专栏 1148

高德地图-获取定位-失败原因-浏览器定位异常场景

提示:也能实现,但是需要https协议,而且请求时间很长,要么你用梯子,还是不太合适.

shi15926lei的博客 4206

46-多个 ThreadLocal 在 Thread 中的 threadlocals 里是怎么存储的?

Thread、 ThreadLocal 及 ThreadLocalMap 三者之间的关系 在讲解本课时之前,先要搞清楚 Thread、 ThreadLocal 及 ThreadLocalMap 三者之间的关系。我们用最直观、最容易理解的图画的方式来看看它们三者的关系: 我们看到最左下角的 Thread 1,这是一个线程,它的箭头指向了 ThreadLocalMap 1,其要表达的意思是,每个 Thread 对象中都持有一个 ThreadLocalMap 类型的成员变量,在这里 Thread 1 所拥有的

Ssssongsmith 天璇星 1529

论文分享|ECCV2022,PATnet,Cross-Domain Few-Shot Semantic Segmentation,CDFSS新基准,文末有复现教程

这篇论文提出的跨域小样本语义分割(CD-FSS)任务,旨在将源域学习的分割能力迁移到目标域,仅需少量标注样本。针对传统小样本分割方法在跨域场景性能下降的问题,作者提出了基于金字塔锚点变换的网络(PATNet),通过将域相关特征转换为域无关特征,并引入任务自适应微调推理(TFI)提升目标域适应能力。实验表明,PATNet在1-shot和5-shot设置下分别比现有方法提升8.49%和10.61%的准确率。同时,作者构建了CD-FSS基准并设计了任务难度评估指标。代码和数据集已开源,复现难度中等。

m0_74277350的博客 1095

深入理解 ThreadLocal 原理及其在 Java 多线程上下文管理中的应用

是 Java 提供的一个线程级别的变量存储类。它为每个使用该变量的线程提供了一个独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其他线程的副本。通常用于在多线程环境中保存线程的上下文信息,如用户会话、数据库连接等。是 Java 多线程编程中一个非常有用的工具,它允许我们为每个线程创建一个独立的变量副本,从而避免线程间的数据竞争和同步问题。通过,我们可以轻松地管理线程的上下文信息,简化代码,并提高程序的性能。然而,也存在内存泄漏的风险,因此在使用时需要注意及时清理不再需要的变量副本。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 8355

微信小程序 - 实现嵌套H5页面唤起微信支付的实现方案+完整流程源码,微信小程序webview(H5页面)调用微信小程序支付,嵌套h5页面怎么实现小程序支付(Vue2/3移动端H5网页、公众号网页等)

h5嵌入微信小程序微信支付,H5网页嵌入到微信小程序内如何支付,微信小程序webview组件交互,内联h5页面并网页实现微信支付,微信H5页面实现微信小程序支付,微信小程序嵌套webview实现小程序微信支付,小程序中内嵌H5网页支付怎么办,用网页的支付还是小程序的支付?支付没反应,支付报错怎么办,微信小程序内嵌h5,h5调用小程序支付功能解决方案,H5网页cors跨域,真机测试无法唤起支付,无法唤起支付,uniapp微信小程序,h5小程序调用微信支付,微信小程序内嵌H5页面,如何实现微信支付功能,微信小程

🏆 前端领域优质创作者 1万+

【现代人形机器人:从物理建模到大模型驱动的控制与学习】第1章 机器人建模回顾

本章建立读者进行后续控制 / 优化 / 学习工作的数学与计算基础。内容分为三大块:刚体运动学:位姿表示、坐标变换、旋转参数与李代数/李群(指数映射、twist)多关节机构的正/逆运动学:DH 与 POE 两种建模、雅可比矩阵推导、数值/解析逆解方法与奇异性问题约束动力学:拉格朗日公式、牛顿—欧拉递归算法、接触/冲击模型、受约束系统的方程(拉格朗日乘子与互补性条件)每一节同时给出与练习题。假设读者已具备线性代数(矩阵、特征分解、SVD)、多变量微积分与基础力学(牛顿第二定律)知识。

u012133341的博客 185

Java多线程编程-(8)-多图深入分析ThreadLocal原理

前几篇:Java多线程编程-(1)-线程安全和锁Synchronized概念Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用Java多线程编程-(4)-线程间通信机制的介绍与使用Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信Java多线程编程-(6)-两种常用的线程计数器Count

徐刘根的博客 2万+

基于YOLOv8的植物生长阶段识别系统设计与实现

本文详细介绍了一个基于YOLOv8深度学习模型的植物生长阶段识别系统,包含完整的数据集构建、模型训练、评估以及基于PyQt5的用户界面开发过程。系统能够自动识别植物在不同生长阶段(如发芽期、生长期、开花期、结果期等)的形态特征,为精准农业和智能种植提供技术支持。文章提供了完整的代码实现,并讨论了模型优化策略和实际应用场景。关键词:植物生长阶段识别、YOLOv8、目标检测、PyQt5、深度学习。

YOLO 465

深入理解Java ThreadLocal

欢迎转载,转载请注明出处:深入理解Java ThreadLocal!一、定义我们知道多线程环境下访问共享资源的会产生冲突,一般情况下我们可以通过锁机制来限定单个线程访问共享资源,让其他线程等待,但是这种方式会导致阻塞。避免多线程对共享资源访问产生的冲突的根本解决方式就是不共享。Java提供了一种叫做ThreadLocal类,我们称它为线程本地存储,从名称上我们就能看出它不是线程,而是一个存储变量的类

sd_zhuzhipeng的专栏 886

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ThreadLocal原理详解——终于弄明白了ThreadLocal

目录 概述 API介绍 ThreadLocal的理解 ThreadLocal的原理分析 总结 概述 在java学习生涯中可能很多人都会听到ThreadLocal变量,从字面上理解ThreadLocal就是“线程局部变量”的意思。简单的说就是,一个ThreadLocal在一个线程中是共享的,在不同线程之间又是隔离的(每个线程都只能看到自己线程的值)。可能一开始把这句话放出来很难理解,那...

听得到微笑的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java多线程学习之【ThreadLocal】

本文主要是讲解ThreadLocal的概念,基本用法,使用场景,底层代码原理剖析。

blackoon88的博客 732

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ThreadLocal原理详解--终于弄明白了ThreadLocal

ThreadLocal原理详解 在我看到ThreadLocal这个关键字的时候我是懵逼的,我觉得我需要弄明白,于是,我就利用搜索引擎疯狂查找,试图找到相关的解答,但是结果不尽人意。 首先说一下我的理解和感悟: ①什么是ThreadLocal: 首先,它是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。 ②ThreadLocal和Synchonized: 两者都用于解决多线程并发访问。但是ThreadLo

yuanchangliang的博客 1万+

图解,深入浅出带你理解ThreadLocal

ThreadLocal 是我们在学习java时必须优先掌握的内容,而且应用场景广泛。比如以前一些项目,会把前台传的一部分参数放入ThreadLocal,随线程流转;又或者我们经常使用的Spring框架的@Transactional注解,也用到了ThreadLocal。所以学习ThreadLocal,是一个必备,且越早学习越好的基础内容。

战斧的博客 6822

Java多线程之ThreadLocal理解

浅谈Java多线程中对ThreadLocal的理解 大家好!今天学习了java并发编程中的ThreadLocal,特将学习心得整理起来分享给大家,如对理解有误,欢迎大家指出交流。 ThreadLocal是什么 首先先讲一下ThreadLocal是什么,当多线程在维护同一个类变量时,ThreadLocal为每一个线程创建了一个独立的该变量副本,使得每一个线程都可以独立地修改自己内部的变量副本,而不影...

baidu_36278173的博客 252

ThreadLocal的简单理解

目录* 一、背景最近有人问我是如何做到在每个线程中的值都是隔离的,此处写篇文章来简单记录下。比如:用户登录成功后,需要将保存起来,以方便在系统中的任何地方都可以使用到,那么此时就可以使用来实现。例如:中的类。 ThreadLocal的实例推荐使用来修饰。 :这个是线程类,在这个类中存在一个变量,具体的类型是。 2、看下set方法是如何实现的 通过上方的代码,我们可知: 当我们向ThreadLocal中设置一个值,会经过如下几个步骤: 五、ThreadLocalMap中的hash冲突是如何处理的 1、

xuhss_com的博客 174

【26天高效学习Java编程】Day19:Java 多线程

JAVA 最难学的部分是哪里?很多朋友都会说:「 java 多线程 」。随着业务量和数据的增加,我们会不可避免地使用多线程的方式处理数据,同时在 Java 职位的面试中,多线程也是必考的高阶知识点之一,可以说,java多线程是衡量一名 Java 程序员是否资深的关键标准之一。今天,我们就来学习一下 Java 多线程的概念吧!本文将详细讲解Java多线程的创建方式、线程状态、高并发、线程安全、Synchronize以及Lock的使用、Volatile关键字、原子类、并发包、线程池的创建以及死锁等。

Learning_xzj的博客 3200

Java学习整理系列之ThreadLocal的理解

在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的,使用同步机制要求程序慎密地分析什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放对象锁等繁杂的问题,程序设计和编写难度相对较大。而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个

Sup_Heaven的专栏 7698

深入理解(11)java多线程之ThreadLocal原理

深入理解(1)Java注解类型(@Annotation) 深入理解(2)Java枚举类型(enum) 深入理解(3)Java类加载器(ClassLoader) 深入理解(4)Java类型信息(Class对象)与反射机制 深入理解(5)Java内存模型(JMM)及volatile关键字 深入理解(6)Java并发AQS的共享锁的实现(基于信号量Semaphore) 深入理解(7)Java无锁C...

cowbin2012的专栏 1万+

【面试精讲】ThreadLocal是什么,ThreadLocal源码分析,ThreadLocal应用,ThreadLocal内存泄漏

ThreadLocal是Java中的一个类,用于实现线程本地化变量。每个访问ThreadLocal变量的线程都有自己独立初始化的变量副本。ThreadLocal的作用在于为每个线程提供独立的变量副本,避免线程间数据共享导致的同步问题。ThreadLocal的特点包括线程本地化存储、简化线程安全编程、避免多线程共享状态等。本论文详细探讨了ThreadLocal的概念、实现原理及在多线程并发编程中的应用,希望能够为读者提供全面的认识和应用指导。深入理解ThreadLocal的机制和优势,有助于提升。

Java领域优秀创作者 1481

Java多线程编程-(10)-看了这篇关于ThreadLocal的原理应该透彻了

Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-从一个错误的双重校验锁代码谈一下volatile关键字 Java多线程编程-(4)-线程本地ThreadLocal的介绍与使用 Java多线程编程-(5)-线程间通信机制的介绍与使用 Java

Java后端技术 1345

多线程学习之ThreadLocal详细笔记

多线程学习之ThreadLocal详细笔记

qq_40623672的博客 1226
上一篇: Java多线程学习之内存模型
下一篇: JVM学习之类加载过程
sysong13
博客等级 码龄9年 3粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值