ThreadLocal "魔法"

 很多程序员对ThreadLocal的原理不熟。

 ThreadLocal 有个很眩的功能------一个类如果不支持多线程的话, 可以用ThreadLocal来包装它的对象。

 从而被包装的对象就有了"多线程的能力".

 它是如何实现的?要了解这个原理,首先要明白下列几点

 

  1. ThreadLocal  对象 其实只是一个Key对象,是不变的,它并不保存具体的值

  2. ThreadLocal.set(T value) 方法, 并不是把 value保存在ThreadLocal内(这弯很多程序员都没有转过来)

  3. 每个线程(Thread) 都维护了一个Map<ThreadLocal,T>的实例。ThreadLocal的set,get 方法其实是对这个   map进行操作

  4.ThreadLocal的set,get方法在运行过程中,如何找到哪个线程呢? 很简单:通过Thread.currentThread() 就找到了

   5.由于ThreadLocal 对象其实是作为Map的一个Key对象,所以它一次只能携带一个值

 

 

总结:ThreadLocal 包装的对象,其实是为每个线程创建一个对象而已,这样的话,一个对象只属于一个线程,也就不会存在多线程的问题。所以"多线程的能力" 其实是个假像,一个"魔法"而已. 

思想精髓是: 用空间(每个线程都创建一个对象)来换取时间(同步消耗的时间)

 

  

 

 

 

  

PageHelper分页插件ThreadLocal陷阱与解决方案 MyBatis分页插件PageHelper通过ThreadLocal机制实现SQL自动改写,是Java持久层开发中的常用工具。其核心原理是利用拦截器在SQL执行前动态添加LIMIT子句,依赖ThreadLocal存储分页参数。这种设计虽然便捷,但在Web应用的线程池环境下存在参数污染风险——当线程被复用时,残留的分页参数可能导致非分页查询意外返回部分数据。通过分析Tomcat线程模型和ThreadLocal工作机制,可以理解这类'幽灵分页'问题的产生原因。解决方案包括及时调用clearPage()清理、使用 阅读详情

相关推荐

【Musescore 】开源打谱软件 快速入门笔记

前两天做了个西贝柳斯的打谱软件学习笔记,反正都是初学,今天再来学习一款同类软件,比较之后确定一款深入学习。 西贝柳斯的学习笔记在此:https://blog.youkuaiyun.com/yuetaope/article/details/120020342 西贝柳斯是商业收费软件,要么花钱,要么盗版,如果您觉得这两者都不大好,那么推荐您试试Musescore。 Musescore是一款非常优秀的开源的打谱软件,生态繁荣。“开源”和“生态”是码农业的术语,我用正常人类的语言简单解释一下。 开源就是开放程序源代码,对码农

专注于医院数据分析技术与系统开发的创作与分享。 1万+

故事Java:ThreadLocal,给每个线程发一个“私人魔法背包”

概念普通共享变量 (大坩埚)(私人魔法背包)数据归属公共,所有线程共享一份私有,每个线程独享一份副本线程安全❌非安全,需加锁保护✅安全,数据天然隔离核心思想时间换空间(大家排队用一个)空间换时间(每人发一个,不用等)故事比喻一个公用的大锅一个凭咒语召唤的私人背包一句话总结大家一起用,得排队。各用各的,互不打扰。为解决多线程环境下的并发问题提供了一种全新的思路。

郑龙飞 958

【上海大学计算机组成原理实验报告】五、机器语言程序实验

机器语言程序实验//理解计算机执行程序的实际过程//学习编制机器语言简单程序的方法//将R1中的数值左移n次送OUT,其中n是R2中的数值。(指令码从10开始)//完成R3=R0×R1,结果送OUT。(指令码从30开始)//建立“中文汇编指令”需要哪些条件?//上海大学计算机组成原理实验报告

HackerKevon的博客 2187

ThreadLocal :在 Java中隱匿的魔法之力

ThreadLocal 并不是一个Thread,而是 ThreadLocalVariable(线程局部变量)。也许把它命名为 ThreadLocalVar更加合适。线程局部变量就是为每一个使用该变量的线程都提供一个变量值的副本,是 Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。ThreadLocal是除了加锁这种同步方式之外的另一种保证多线程访问出现线程不安全的方式。

程序猿进阶 8383

22AP10 SS524 平替 海思HI3521DV200 可提供开发资料

入,突破了数字接口的视频输入性能瓶颈,提供两倍于前代产品的视频输入能力。视频编解码引擎、视频图像处理的算法效果及性能得到了进一步提升。芯片为客户产品提供了高性能、优异图像质量。推理引擎,支持多种智能算法应用。合丰富的外围设备及高速接口,该。解决方案,广泛用于模拟高清。产品应用开发的新一代专。四核处理器和性能强大的。

szhorsway的博客 1011

告别模糊与偏色:使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战心得

本文详细介绍了如何使用RKISP Tuner为RK3588s+IMX415进行图像质量调优的实战经验。从调试环境搭建到3A算法优化,再到画质增强模块的深度调参,提供了全面的技术指导和参数建议,帮助工程师解决噪声、色偏和细节模糊等常见问题,显著提升成像质量。

weixin_28729205的博客 452

【Spring】ThreadLocal详解 线程隔离的魔法与陷阱

本文深入解析了Spring框架中的PlatformTransactionManager接口,从四个维度详细阐述其工作原理和使用方法: 核心作用与设计理念: 作为事务管理的核心策略接口,封装底层持久化框架的事务能力 提供统一编程模型,包含获取事务、提交和回滚三个核心方法 工作原理深度解析: 采用策略模式,不同数据访问技术提供不同实现 通过ThreadLocal实现资源绑定机制 详细分析事务传播行为的底层实现 使用方法: 声明式事务:通过@Transactional注解实现自动管理 编程式事务:适用于需要精确控

瘦到被风吹走的博客 1385

数字逻辑EduCoder课设项目 厨房计时器系统设计 Logisim实现

数字逻辑EduCoder课设项目 厨房计时器系统设计 Logisim实现

weixin_51693702的博客 1万+

SimpleDateFormat线程安全终极方案:ThreadLocal魔法抽屉实践

这样,当这个工匠(这个线程)下次被分配一个新任务时,或者当这张工作台(这个线程)被另一个任务复用时,抽屉里就是干净的,不会拿到上一个任务的旧令牌。如果工匠发现抽屉里竟然有之前任务留下的令牌,这就意味着上一个使用这张工作台完成任务的工匠(可能是自己,也可能是同一个工匠身份但处理不同任务)忘了清理!清理他的“私人魔法抽屉”,那么当这个工匠(同一个线程)被分配下一个任务时,新任务可能会看到上一个任务遗留的物品,导致数据混乱或“内存泄漏”(因为这些旧物品可能永远不会被回收,如果。如果一个工匠完成任务后没有通过。

郑龙飞 1511

RK3588设备树调试实战:解决NPU不加载、USB3.0识别异常与DP显示问题

本文深入探讨了RK3588设备树调试中的三大典型问题:NPU不加载、USB3.0识别异常与DP显示问题。通过详细的问题定位步骤、关键设备树修改和调试技巧,帮助开发者快速解决硬件适配中的挑战,提升RK3588平台的开发效率。

weixin_30576827的博客 476

一篇把 Transport 做到可复制的实战指南:从 CTS 底层表到 LSMW、Variant、Layout、TABU、Query、SAPscript 全对象搬运

本文深入解析SAP系统中的Transport机制,将其视为可审计、可追溯的变更流水线。文章从CTS/Transport Organizer通用方法论和具体对象搬运手法两个层面展开,详细介绍了LSMW项目、程序Variant、屏幕/ALV Layout、表数据、ABAP Query、SAPscript和SO10标准文本等对象的传输策略。通过真实案例说明,代码对象往往能被正确传输,但"运行体验"和"业务配置"却常被遗漏,导致QAS测试正常而PRD环境异常。文章提供了一套可

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 170

ThreadLocal开放寻址法解析

ThreadLocal采用开放寻址法实现线程隔离的本地存储。每个线程维护一个ThreadLocalMap,使用数组而非链表结构。其核心机制是:通过0x61c88647这个斐波那契散列魔法数,配合原子递增为每个ThreadLocal实例生成唯一哈希码,再利用&(len-1)位运算快速定位数组下标。这种设计针对小数据量场景优化,避免了链表的内存开销,同时利用均匀散列减少开放寻址法的冲突,兼顾了性能和内存效率。选择开放寻址法而非链地址法,主要考量是线程私有数据量小、缓存友好等特性。

weixin_48546267的博客 1478

精读204页华为的流程管理(文末附下载链接)

链接:https://pan.baidu.com/s/1eEwdBR5c0PIxkOrNhDZcGg?pwd=wha2 提取码:wha2 复制这段内容后打开百度网盘手机App,操作更方便哦。,以提升企业运营效率和竞争力,同时解决了诸多业务痛点,为华为的全球化发展提供了有力支撑。华为的流程管理对其发展起着关键作用,通过构建完善的流程体系,提升了企业运营效率与竞争力。华为的流程管理在企业发展中至关重要,其围绕。,并通过流程变革不断优化。在流程管理过程中,强调。构建了全面的流程体系。

cdfunlove的博客 282

ThreadLocal:在Java中隐匿的魔法之力

在Java编程的世界中,ThreadLocal是一个常被提及但鲜少被深入理解的类。它仿佛拥有一种隐匿的魔法之力,能在多线程环境中巧妙地维护每个线程的私有数据,使得线程间的数据隔离变得简单而高效。本文将带领读者揭开ThreadLocal的神秘面纱,探索其背后的工作原理和应用场景。一、ThreadLocal的魔法之源ThreadLocal,顾名思义,就是线程本地变量。它的主要特点是每个线程对其访问的数...

Java团长的博客 81

VC中sqlite的使用

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

threadlocal中hash

threadlocal中的hash threadlocal的内存分布如下图所示。 每一个线程都有一个threadlocalmap(如上图所示),threadlocalmap在threadlocal类中定义。threadlocalmap没有继承map而是自己写了一套类似map的容器。threadlocalmap中存放的是一个数组,名字叫table,table中放着一个个的Entry,En...

只布布倩 1870

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ThreadLocal原理(简单易懂)

最近公司开展了一个新项目,使用token达到API的无状态,其中有一个功能,是在timeline上展示不同的action是由哪个user操作的。这个时候我们需要在service中获得token信息,但是使用参数传值会十分冗余,此时ThreadLocal就发挥了很好的作用。

学习即修行 6万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ThreadLocal类详解与源码分析

概述我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。 我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享。 虽然模板类通过资源池获取数据连接或会话,但资源池本身解决的是数据连接或会

不断成长的我 4950

(转)spring里面对ThreadLocal的使用

我们知道Spring通过各种模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享。虽然模板类通过资源池获取数据连接或会话,但资源池本身解决的是数据连接或会话的缓存问题...

u012190520的专栏 1万+

ThreadLocal黑魔法:用快马AI三分钟构建线程安全Web应用

通过这个项目,我对ThreadLocal的理解更加深入了。它不仅简化了多线程编程的复杂性,还能有效提升性能。如果你也想快速体验ThreadLocal的强大功能,可以试试。

IndigoNight21的博客 616

java ThreadLocal

ThreadLocal是解决线程安全问题一个很好的思路,ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本,由于Key值不可重复,每一个“线程对象”对应线程的“变量副本”,而到达了线程安全。我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模

U的博客 2984

java中ThreadLocal类的使用

ThreadLocal是解决线程安全问题一个很好的思路,ThreadLocal类中有一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值对应线程的变量副本,由于Key值不可重复,每一个“线程对象”对应线程的“变量副本”,而到达了线程安全。 我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同

cactusz的博客 315

Spring与ThreadLocal

我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。 我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享。 虽然模板类通过资源池获取数据连接或会话,但资源池本身解

小飞虫 366

ThreadLocal以及内存泄露原理的源码解析

一键源码解析ThreadLocal

一年,我很需要这一年 1188

Spring mvc 线程安全 threadLocal

我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享。虽然模板类通过资源池获取数据连接或会话,但资源池本身解决的是数据连接或会...

weixin_43706468的博客 1255

ThreadLocal的原理和在框架中的应用

我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。       我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被多个线程共享。       虽然模板类通过资源池获取数据连接或会话,但资源

丹妮专栏 962

ThreadLocal实现线程安全

Spring通过各种模板类降低了开发者使用各种数据持久技术的难度。这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突。我们使用模板类访问底层数据,根据持久化技术的不同,模板类需要绑定数据连接或会话的资源。但这些资源本身是非线程安全的,也就是说它们不能在同一时刻被...

chuizhuquan8731的博客 772
上一篇: sql server 2005 in 和 not exists的一个微妙区别
下一篇: Java多线程模式之Single Threaded Execution
NetFishTail
博客等级 码龄19年 3粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值