多线程(四):ThreadLocal

多线程(六):ThreadLocal 关键字 本文包括:Thread 的定义,注意点和Demo例子。 阅读详情

一、简述

ThreadLocal可以看作是一种数据结构,底层用map来实现。

ThreadLocal为每一个线程创建一个线程本地(thread-local)的变量,每个线程都有其独有的本地变量,相互之间的操作互不影响。

在多个线程并发访问同一个变量时,为了保证数据安全,synchronized或是Lock对对象上锁,当线程持有锁,其他线程不得访问,只有当持有锁的线程执行完毕,其他线程才能够获取锁继续执行。这种线程持有锁的机制,可以看作是花费额外时间来保证并发安全。

而使用ThreadLocal,将多个线程要访问的数据放入ThreadLocal中,则多个线程在访问ThreadLocal时,会为每一个线程创建一个  ”数据副本“,每个线程只是在操作自己的数据副本,相互之间不会影响。ThreadLocal的这种机制可以看作是用额外的空间来达到数据安全的目的。

代码示例:

public class ThreadLocalDemo extends Thread {
	private static int value=3;
	ThreadLocal<Integer> threadLocal = new ThreadLocal<>();

	@Override
	public void run() {
		threadLocal.set(value);
		int temp = threadLocal.get();
		for (int i = 0; i < 3; i++) {
			System.out.println(Thread.currentThread().getName() + " " + temp--);
		}
	}

	public static void main(String[] args) throws InterruptedException {
		ThreadLocalDemo threadLocaDemo1 = new ThreadLocalDemo();
		ThreadLocalDemo threadLocaDemo2 = new ThreadLocalDemo();
		ThreadLocalDemo threadLocaDemo3 = new ThreadLocalDemo();
		threadLocaDemo1.start();
		threadLocaDemo2.start();
		threadLocaDemo3.start();
	}
}

二、源码

ThreadLocal的源码并不复杂,在此尝试扒一下源码。

首先看ThreadLocal.java的Outline:

从方法名就能知道方法的作用是什么。另外还有一个protected方法initialValue(),可以用来返回current thread的initial value,当第一次调用get()会返回这个初始值,如果在get()之前没有set(),返回null。

在必要时可以覆写initialValue()来指定一个初始值,这样不调用set()直接get()也不会返回null:

ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
		protected Integer initialValue(){
                        //指定初始值为0
			return 0;
		}
	};

看一下set()的源码:

可以看到set()是用一个ThreadLocalMap类型的map来保存数据,以ThreadLocal对象为key,存储的数据为value。set()首先用getMap()来获取map,获取到map之后将value存入,如果map不存在新建map。

点进getMap()看一看:

getMap()返回的threadLocals是在Thread类中一个类型为ThreadLocalMap的属性。

点进createMap():

创建了一个map,将ThreadLocal对象作为key,传入的值作为value存入,并将map保存在Thread的threadLocals属性中。

再看一下get()的源码:

get()获取Thread的map,如果map不为空,继续获取Entry,再获取value;如果map为空的话,调用setInitialValue()方法,setInitialValue()是将initialValue存入map。

(ThredLocal、ThredLocalMap、Entry之间的类关系:)

-------------------------------------------------------summary---------------------------------------------------------

以上,可以明了ThreadLocal数据隔离的过程:ThreadLocal好像一个壳,存储数据的其实是ThreadLocalMap,而每一个线程(Thread)都有一个独立的ThreadLocalMap(threadLocals属性),Thread和ThreadLocal通过ThreadLocalMap关联起来,每个线程(Thread)在操作ThredLocal时,操作的都是他自己的ThreadLocalMap。

基于PLC智能立体车库控制系统设计 摘要 本系统设计以三层立体车库为研究对象,通过对立体车库的原理分析、动作流程设计和一系列的软硬件设计,达到立体车库自动化控制的目的。系统采用可编程控制器作为立体车库控制系统的控制单元,实现该系统的工艺要求,通过程序仿真调试,完成系统的各种动作要求,达到自动控制的目的。系统设计分为总体设计、硬件设计以及软件设计。按照立体车库控制系统的控制策略进行图纸设计;重点分析工艺流程图,对立体车库控制系统进行程序编译和MCGS上位机调试,通过系统的调试和修改,达到了基本控制的要求。系统设计明确了工艺要求,确定 阅读详情

相关推荐

EtherCAT主站视角:如何正确配置一个支持动态PDO的从站(以倍福TwinCAT为例)

本文详细解析了在TwinCAT环境下配置支持动态PDO的EtherCAT从站的全过程。通过MDP(Modular Device Profile)实现模块化配置,涵盖从站工作原理、TwinCAT工程配置、调试技巧到高级应用实践,帮助工程师快速掌握动态PDO配置技术,提升工业现场设备扩展与维护效率。

weixin_30466039的博客 267

Map在多线程中使用

背景: 在实际操作中经常会遇到一种场景,我们需要用一个成员属性Map来保存信息,这时我们可能起两个线程甚至更多,一个线程用来给Map装值,另外一个线程用来每隔一段时间就去Map那取值并清空Map。 实现: 根据上面场景需求,很简单,刷刷刷...,代码写好了,main thread用来给Map装东西,TimeTask  thread用来取Map里面的东西 public c

sunrise_zhu的专栏 1万+

VizCut 全自动批量视频二次去重处理!支持视频无水印解析下载和批量剪辑,完全免费,使用简单!

可制作和分享剪辑模板,已提供20+种剪辑方案,内置众多扫光蒙版素材。支持二次去重批量处理,完全免费,无广告,且支持视频无水印解析下载,非常强大。如果说我们处理的视频需要进行一样的参数设置的话,就可以把我,1设置的参数设置为模板,后面就可以一键调用。1. 本地CPU处理,可设置线程数,可开启GPU加速,无任何限制,全看机器性能。适用场景:自媒体搬运、短视频二创、批量去重等,完全免费,无广告干扰!3. 20+种参数可调可选,内置很多相关素材。可保存为模板,可复用、可分享、可导入。2. 所有参数的设置,

goodfat的博客 5324

20200409 ThreadLocal

ThreadLocal,并发编程 ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 在ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程...

陈如水的专栏 392

永磁同步电机FOC控制实战:如何用线性死区补偿解决低速抖动问题(附Matlab仿真代码)

本文详细介绍了永磁同步电机FOC控制中线性死区补偿技术的工程实现方法,有效解决低速抖动问题。通过Matlab/Simulink仿真验证,该方案可将转矩脉动降低70%以上,显著提升系统稳定性。文章包含完整的数学模型构建、Simulink实现步骤及参数整定技巧,为工程师提供实用解决方案。

weixin_30872499的博客 154

uniapp [安卓苹果App端] - 实现支付宝支付功能+拉起支付宝app付款支付后返回跳转到原页面,详解uniApp如何唤起本机支付宝并跳转到支付页面全流程及示例源码(APP端支付宝支付,支持打包

全网最详细的uniapp支付宝支付教程,uniapp支付宝支付流程,uni-app项目在APP端使用支付宝支付功能,uniapp前端实现支付宝支付,uniapp中唤醒支付宝进行支付并返回app,uniApp调起支付宝支付失败报错,uniapp app端调支付宝支付接口,uniapp开发安卓App对接支付宝支付,uniapp苹果ios唤起支付宝支付,uniapp调用支付宝支付uniapp开发app-调用支付宝支付,uniapp开发安卓苹果app如何接入支付宝支付,UniApp中实现支付宝支付功能,支付报错,调

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

深入理解ThreadLocal

文章目录1、什么是 ThreadLocal2、ThreadLocal 使用案例3、ThreadLocal和 sychronized区别 1、什么是 ThreadLocal ThreadLocal类用来为线程内部提供局部变量。该变量在多线程环境下读写能保证各个线程变量独立于其他线程内的变量。不同的线程之间不会相互干扰! 总结: 线程并发:在多线程并发场景下(单线程不需要使用ThreadLocal) 传递数据:我们可以通过ThreadLocal在同一线程,不同组件中传递公共变量 线程隔离:每个线程变量都

保持学习 1550

word多级列表为什么会变成黑块解决思路

今天在写文档时,发现WORD5级的标题都变黑块了,找了度娘的资料,终于解决了。 第一种 1、光标bai放在黑快的右边,按向左的箭头,然后ctrl+shift+s,点击重新应用。 2、点击“定义新的多级列表”(不知道从哪儿找这个按钮的百度下),直接点确定。 3、这里很重要!!!不要直接保存,而是直接关掉word,会提示保存还是不保存,这个地方再点击保存。 第二种 Word2016 使用宏代码修复方法 1.找到视图-宏,打开 查看宏 2.创建宏 3.贴...

霍力强的专栏 8581

Java并发编程:ThreadLocal

正经学徒,佛系记录,不搞事情 原文链接:https://www.jianshu.com/p/98b68c97df9b ThreadLocal是什么 ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。 从数据结构入手 ...

toBeMN的博客 352

即插即用系列(代码实践)| GRSL 2024 ARConv核心模块:自适应矩形卷积——专为遥感图像设计,打破固定方形卷积束缚

摘要: 本文提出了一种用于遥感图像处理的自适应矩形卷积模块(ARConv),解决了传统方形卷积核在处理复杂几何结构(如细长道路、密集建筑物)时导致的光谱混叠和边缘模糊问题。ARConv通过动态调整卷积核的长宽比和旋转角度,使卷积核形状与地物特征自适应匹配。该模块可即插即用于全色锐化、语义分割等遥感任务,有效提升边缘保持能力和光谱保真度。核心代码基于PyTorch实现,包含偏移量生成和几何变换逻辑,支持梯度缩放以稳定训练。

分享顶会顶刊论文即插即用模块 140

Allegro如何画Photoplot_Outline操作指导

在用Allegro进行PCB设计的时候,最后进行光绘输出前,Photoplot_Outline是必备一个图形,所有在Photoplot_Outline中的图形将被输出,Photoplot_Outline以外的图形都将不被输出。如何绘制Photoplot_Outline,具体操作如下。如何画Photoplot_Outline操作指导。

weixin_54787054的博客 2636

有关 ThreadLocal 的一切

早上好,各位新老读者们,我是七淅(xī)。 今天和大家分享的是面试常驻嘉宾:ThreadLocal 当初鹅厂一面就有问到它,问题的答案在下面正文的第 2 点。 1. 底层结构 ThreadLocal 底层有一个默认容量为 16 的数组组成,k 是 ThreadLocal 对象的引用,v 是要放到 TheadLocal 的值 public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = ge

七淅的博客 860

Arduino ESP32 Web服务器从microSD卡读取

Arduino ESP32 Web服务器从microSD卡读取 将网页内容放到SD卡中,当有客户端数据请求时,从SD卡读取信息进行发送,比起SPIFFS文件系统,更节约板上的硬件资源。 SD卡接线说明 ESP32----- SD D5(GPIO 5)-----CS D18(GPIO 18)-----SCK D19(GPIO 19)-----MISO D23()GPIO 23-----MOSI 文件放置 需要把文件放置到SD卡的根目录下。注意SD卡的格式FAT32格式。 实例代码 /*

perseverance51博客 1434

关于java多线程浅析四:ThreadLocal

什么是ThreadLocal ?乍一看,ThreadLocal这个单词还以为根据直译是”本地线程”,是一个线程?其实不然,其实ThreadLocal可以理解成一个工具,一个操作每个线程中都独有的map的入口。与同步机制不同,ThreadLocal提供了另一种针对多线程访问变量冲突问题的解决思路。同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份

jake_fei的博客 604

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java多线程基础总结四:ThreadLocal

[size=medium] 说到[b]ThreadLocal[/b],首先说说这个类的命名。直观上看好像是个Thread的什么亲戚,但其实它想表达的意思是线程本地变量,也就是说每 个线程自己的变量。它作为一个JDK5以后支持范型的类,主要是想利用范型把非线程安全的共享变量,封装成绑定线程的安全不共享变量。 这样的解释我想我们多半能猜出它的实现思路:把一个共享变量在每个线程使用时,初始化一个副...

JJiaoAo的专栏 161

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

微服务之间共享threadlocal_多线程篇四:ThreadLocal实现线程范围内变量共享

1.static实现线程范围内变量共享packagecom.test.shareData;importjava.util.Random;/*** 多线程范围内的数据共享*@authorAdministrator**/public classThreadScopeShareData {private static intdata;public static voidmain(String[] arg...

weixin_39767121的博客 645

VC中sqlite的使用

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

SE高阶(7):多线程—④ThreadLocal类对于线程同步的作用

ThreadLocal的作用 ThredLocal是多线程中为了保证线程安全而提供的工具类,它可以代表一个线程局部变量,该类支持泛型。 每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。 将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中

我只是个程序员。 638

解锁Java多线程安全的秘密武器:探索ThreadLocal的神奇力量!

ThreadLocal是Java中的一个类,用于在多线程环境下,为**每个线程**提供**独立的变量副本**。每个线程都可以独立地访问自己的变量副本,因为该独立变量属于**当前线程**,对其他线程而言是隔离的,不会与其他线程的副本产生冲突。

fumeidonga的博客 1450

多线程-ThreadLocal

ThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的时候(通过其get或set方法)都有自己的、独立初始化的变量副本。ThreadLocal实例通常是类中的私有静态字段,使用它的目的是希望将状态(例如,用户ID或事务ID)与线程关联起来。

存在,即合理 1315

Java 多线程之 ThreadLocal 的使用

ThreadLocal 用于在多线程环境中维护线程封闭(thread-local)的变量。线程封闭是一种确保变量在多线程环境中的线程安全性的机制,每个线程都有自己独立的变量副本,互不干扰。ThreadLocal 提供了一种简单的方式来实现线程封闭,它为每个线程都创建了一个独立的变量副本。使用场景保存线程私有数据:当多个线程需要访问某个数据,但每个线程都需要有自己的数据副本时,可以使用 ThreadLocal。

QIFU的专栏 1668

多线程中ThreadLocal详解

1. ThreadLocal是什么,是用来解决什么问题的? ThreadLocal从字面意思来理解,是一个线程本地变量,也可以叫线程本地变量存储。有时候一个对象的变量会被多个线程所访问,这个时候就会有线程安全问题,当然可以使用synchronized关键字来为该变量加锁,进行同步处理来限制只能有一个线程来使用该变量,但是这样会影响程序执行的效率,这时ThreadLocal就派上了用场; 使用T...

Helon的博客 6628

【多线程】ThreadLocal

文章目录两种典型应用场景场景1独享对象代码迭代gitThreadLocal:解决加锁性能问题什么是ConcurrentHashMap?ThreadLocalThreadLocal作用主要方法方法ThreadLocal原理及源码注意问题内存泄漏解决:内存泄漏(阿里规约,调用的最后remove())空指针异常解决: 注意强引用 弱引用 两种典型应用场景 场景1独享对象 代码迭代git 但通过加锁解决共享对象 性能问题:还存在sycnized同一时间只能处理一个的,排队问题 ThreadLocal:解决加锁

瑞新の博客:bennyrhys 3094

ThreadLocal类解决多线程同步问题

问题引出 我们简单写一段代码,创建三个线程获取信息,代码如下 package dataStructure; public class ThreadLocalDemo { public static void main(String[] args) { new Thread(()->{Message msg = new Message() ; msg.setInfo("第一个线程"); Channel.setMessage(msg); Channel.send();} , "线程A"

sapere_aude的博客 1188

java多线程 —— ThreadLocal

目录 1、什么是ThreadLocal? 2、为什么要用ThreadLocal? 3、ThreadLocal的内部实现? 4、怎么用ThreadLocal? 1、什么是ThreadLocal? ThreadLocal是一种变量类型,称为“局部变量类型”。一般用private static修饰。 2、为什么要用ThreadLocal? 提供线程间的数据隔离效果。 我们知道多线...

向来缘浅,奈何情深 1722

【多线程与高并发之ThreadLocal】——ThreadLocal简介

目录 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、ThreadLocal是什么?二、ThreadLocal有什么用?1.引入库2.读入数据三、ThreadLocal源码分析四、ThreadLocal最佳实践总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、ThreadLocal是什么? 示

幸运的梦之星 2050

(四)java多线程之ThreadLocal

本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.youkuaiyun.com/tianshi_kco github: https://github.com/kco1989/kco 代码已经全部托管github有需要的同学自行下载 ...

chunzaigu1582的博客 116
上一篇: 多线程(三):synchronized和Lock
下一篇: 多线程(五):线程池
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值