- 浏览: 288909 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
-
jj19900703:
多个pattern代码如下:public class Date ...
ThreadLocal示例 -
jj19900703:
上面这些评论真是搞笑,根本没弄懂瞎评论误导人。第一:Simpl ...
ThreadLocal示例 -
myumen:
helong0904 写道在世界的中心呼喚愛 写道helong ...
ThreadLocal示例 -
helong0904:
在世界的中心呼喚愛 写道helong0904 写道zhang3 ...
ThreadLocal示例 -
myumen:
在世界的中心呼喚愛 写 ...
ThreadLocal示例
一、ThreadLocal概述
学习JDK中的类,首先看下JDK API对此类的描述,描述如下:
API表达了下面几种观点:
1、ThreadLocal不是线程,是线程的一个变量,你可以先简单理解为线程类的属性变量。
2、ThreadLocal 在类中通常定义为静态类变量。
3、每个线程有自己的一个ThreadLocal,它是变量的一个‘拷贝’,修改它不影响其他线程。
既然定义为类变量,为何为每个线程维护一个副本(姑且成为‘拷贝’容易理解),让每个线程独立访问?多线程编程的经验告诉我们,对于线程共享资源(你可以理解为属性),资源是否被所有线程共享,也就是说这个资源被一个线程修改是否影响另一个线程的运行,如果影响我们需要使用synchronized同步,让线程顺序访问。
ThreadLocal适用于资源共享但不需要维护状态的情况,也就是一个线程对资源的修改,不影响另一个线程的运行;这种设计是‘空间换时间’,synchronized顺序执行是‘时间换取空间’。
二、ThreadLocal方法介绍
T |
get() 返回此线程局部变量的当前线程副本中的值。 |
protected T |
initialValue() 返回此线程局部变量的当前线程的“初始值”。 |
void |
remove() 移除此线程局部变量当前线程的值。 |
void |
set(T value) 将此线程局部变量的当前线程副本中的值设置为指定值。 |
三、深入源码
ThreadLocal有一个ThreadLocalMap静态内部类,你可以简单理解为一个MAP,这个‘Map’为每个线程复制一个变量的‘拷贝’存储其中。
当线程调用ThreadLocal.get()方法获取变量时,首先获取当前线程引用,以此为key去获取响应的ThreadLocalMap,如果此‘Map’不存在则初始化一个,否则返回其中的变量,代码如下:
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
调用get方法如果此Map不存在首先初始化,创建此map,将线程为key,初始化的vlaue存入其中,注意此处的initialValue,我们可以覆盖此方法,在首次调用时初始化一个适当的值。setInitialValue代码如下:
private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
set方法相对比较简单如果理解以上俩个方法,获取当前线程的引用,从map中获取该线程对应的map,如果map存在更新缓存值,否则创建并存储,代码如下:
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
对于ThreadLocal在何处存储变量副本,我们看getMap方法:获取的是当前线程的ThreadLocal类型的threadLocals属性。显然变量副本存储在每一个线程中。
/** * 获取线程的ThreadLocalMap 属性实例 */ ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
上面我们知道变量副本存放于何处,这里我们简单说下如何被java的垃圾收集机制收集,当我们不在使用是调用set(null),此时不在将引用指向该‘map’,而线程退出时会执行资源回收操作,将申请的资源进行回收,其实就是将属性的引用设置为null。这时已经不在有任何引用指向该map,故而会被垃圾收集。
四、ThreadLocal应用示例
在我的另一篇文章,对ThreadLocal的使用做了一个实例,此示例也可以用作生产环境,请参见:http://ari.iteye.com/blog/757641
如有问题请留言讨论,谢谢
评论
ThreadLocal最好不要做成static的
ThreadLocal最好不要做成static的 : 你。。。说反了吧
ThreadLocal最好不要做成static的
<div class="quote_div">
<div class="quote_title">snake1987 写道</div>
<div class="quote_div">其实哪有这么复杂,就一个2层的map<br>第一层是Thread.currentThreand()为key,存的map<br>第二层是ThreadLocal.this为key,存的值,不就取出来了</div>
<p> 这样说也不对,你所说的第一层map是不存在的,你所说的第二层Map实际上是Thread的一个属性,仔细读读<span>niumd</span>的这个这个帖子你就明白了。看看Thread中的一小段代码:</p>
<p> </p>
<pre name="code" class="java"> /* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;</pre>
<p> 上面的代码来自JDK源码,给Thread定义了一个<span style="font-size: 14.4px; white-space: pre;">ThreadLocal.ThreadLocalMap类型的属性,用于存线程变量。你再看看ThreadLocal中的get和set方法你就明白了!</span></p>
<p> </p>
<p> </p>
</div>
<p><br>这个两层的Map<br>ThreadLocal对象本身存放在线程栈上,他用来存储线程的变量, 可自身也是线程的一个变量? </p>
<p>上一层的大MAP存在堆上?</p>
ThreadLocal不是用来解决对象共享访问问题的,而主要是提供了保持对象的方法和避免参数传递的方便的对象访问方式。
http://www.iteye.com/topic/617368
robbin曾说过
robbin是谁??
robbin 你都不知道,你就不算来过javaeye

static class ThreadLocalMap { /** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entries" in the code that follows. */ static class Entry extends WeakReference<ThreadLocal> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal k, Object v) { super(k); value = v; } }
请看以上的源代码,在ThreadLocalMap 内部的Entry 是WeakReference。 请问这个entry定义为弱类型,不是会很快随机的被GC回收吗? 不过通常一个 Thread的生存时间可能更小,所以应该没有问题,是吧?请GS解答一下
Thread t = Thread.currentThread();
ThreadLocalMap map = t.threadLocals;
这个map的Key为ThreadLocal对象,Value为当前设置的值
设置值:
map.set(ThreadLocal对象, Value);
取值:
map.get(ThreadLocal对象)
<div class="quote_div">其实哪有这么复杂,就一个2层的map<br>第一层是Thread.currentThreand()为key,存的map<br>第二层是ThreadLocal.this为key,存的值,不就取出来了</div>
<p> 这样说也不对,你所说的第一层map是不存在的,你所说的第二层Map实际上是Thread的一个属性,仔细读读<span style="">niumd</span>的这个这个帖子你就明白了。看看Thread中的一小段代码:</p>
<p>
</p>
<pre name="code" class="java"> /* ThreadLocal values pertaining to this thread. This map is maintained
* by the ThreadLocal class. */
ThreadLocal.ThreadLocalMap threadLocals = null;</pre>
<p> 上面的代码来自JDK源码,给Thread定义了一个<span style="font-size: 14.4px; white-space: pre;">ThreadLocal.ThreadLocalMap类型的属性,用于存线程变量。你再看看ThreadLocal中的get和set方法你就明白了!</span></p>
<p> </p>
<p> </p>
自己看看API反而是最好的捷径
robbin曾说过
robbin是谁??
robbin曾说过
在信息化时代 对于网页开发 我们平常所说的性能 不就是指的时间吗?
不禁让我想到索引 索引就是用空间换时间的典型应用 如果大家熟悉lucence的话 大家
应该都深有同感
主要讨论ThreadLocal内部是实现细节,并非简单的JDK翻译;
第一层是Thread.currentThreand()为key,存的map
第二层是ThreadLocal.this为key,存的值,不就取出来了
如果在set一次,再get的时候,拿出来的是第二次的吧,第一个对象自动销毁?
ThreadLocal利用系统的WeakReferences进行对象的维护,
理论上说不需要显式的remove,
但要注意WeakReferences有时也会带起Memory Leaks。
比如inner class的情况下采用ThreadLocal
http://crazybob.org/2006/02/threadlocal-memory-leak.html
等到ThreadLocal set对象到当前的Thread的这个Thread结束了,对象就自动销毁,是吧?
可以set(null);
等到ThreadLocal set对象到当前的Thread的这个Thread结束了,对象就自动销毁,是吧?
如果在set一次,再get的时候,拿出来的是第二次的吧,第一个对象自动销毁?
发表评论
-
Java8学习笔记:Lambda表达式定义
2016-12-03 22:17 21Lambda定义 Lambda是可传递的匿名函数,它没有名 ... -
浅析BlockingQueue实现
2013-05-21 22:16 1640BlockingQueue BlockingQueue ... -
Jboss Netty源码分析一
2011-05-14 10:29 8502本文采用版 ... -
浅谈Selector创建机制
2011-05-10 14:33 1404前段时间阅读mina源码时,理解Selector实例化机制细 ... -
探究Struts2运行机制:StrutsPrepareAndExecuteFilter 源码剖析
2010-11-30 23:29 6343作者:niumd blog:http://ari.i ... -
【翻译】Spring Integration参考手册中文版
2010-11-26 14:36 6443工作主要基于商业中间件TIBCO做EA ... -
ThreadLocal示例
2010-09-07 16:27 26202本文借花献佛,引用Tim Cull的博文“Simple ... -
八个改善Java遗留系统的技巧
2010-09-06 09:32 562你没看错,就是这个题目:即使是Java系统也会变成“ ... -
高并发下NIO socket消息超时机制的探讨
2010-09-02 12:31 2737去年参与项目的 ... -
项目重构之命令模式
2010-06-13 10:23 1035项目中有个业务处理类大小117K,代码2700行,看此 ... -
Java TCP/IP Socket编程
2010-06-11 13:00 592最想想写一篇关于java socket编程的文章,特此占位,提 ... -
Spring JDBC Framework详解——批量JDBC操作、ORM映射
2010-03-17 21:30 3631作者:niumd,转载请注 ... -
翻译:Apache MINA User Guide】Chapter 2 - Basics 之客户端应用程序
2009-12-28 08:40 1066作者:niumd blog:http://ari.iteye ... -
【翻译:Apache MINA User Guide】Chapter 2 - Basics
2009-12-26 15:08 1210本章节我们将详细介绍基于Apache MINA的C/S ... -
【翻译:Apache MINA User Guide 】 Chapter 1
2009-12-26 14:41 1045作者:niumd blog:http://ari.iteye ... -
MyEclipse8 GA 下载地址 注册码 优化指南
2009-12-26 10:51 3676官方网站 ... -
基本类型,字符串转字节数组
2009-09-22 22:39 778接触SMPP协议,SMPP协议中的消息分为消息头、消 ... -
byte与16进制互转
2009-09-22 22:27 1090private static final char[] kD ... -
jxl导出excel:java.lang.ArrayIndexOutOfBoundsExceptio
2009-05-14 18:54 4101先大致说下项目:公司的一个项目小功能需要上传16 ... -
设计模式精解【中文版书签版】
2009-04-15 12:43 1308工作之余研究java设计模式、个人感觉设计模式精解这 ...
相关推荐
独子棋demo.rar
云安全联盟软件定义边界SDP标准规范2.0202239页.pdf
Uniapp开发的微商个人相册多端小程序源码。使用 HBuilder X 导入本地项目,修改小程序AppID,以及Uni-app应用标识,调试发布即可。 小程序源码特点: 1、首页进行相册展示,采用分页 2、列表页面以文字形式进行分类,管理员可进行添加,修改和排序 3、每个列表下有多个相册,管理员可进行添加,修改和排序 4、每个相册有多张图片,有小图和大图模式进行切换 5、相册中可以长按图片进行选择删除和设为封面 6、相册可以进行分享 7、我的页面有管理员登录,联系客服等功能
内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
地级市政府通过制定相关政策来推动数字经济的发展和数字政府的建设。这些政策可能包括鼓励企业数字化转型、促进数字技术创新、加强数字基础设施建设、优化数字政务服务等方面的内容。政策制定的频率和力度,可以在一定程度上反映政府对数字领域的关注度。 在地级市政府数字关注度的背景下,词频分析成为了一种有效的工具,用以衡量政府文件和宣传资料中涉及数字技术和数字化转型相关词汇的频次,进而揭示政府对这一领域的关注程度和重视方向。 数据名称:地级市-政府数字关注度、词频
内容概要:本文详细探讨了在Android平台上进行图像模板匹配的技术挑战和解决方案,特别是在处理不同尺寸和旋转角度的目标物时的方法。文中介绍了使用OpenCV构建图像金字塔、处理旋转模板以及利用NEON指令集优化性能的具体实现。此外,文章还讨论了在armeabi-v7a和arm64-v8a这两种主要ARM架构下的优化技巧,如内存对齐、SIMD指令优化、RenderScript并行处理等。作者分享了许多实践经验,包括如何避免常见的性能瓶颈和兼容性问题。 适合人群:有一定Android开发经验,尤其是熟悉OpenCV和NDK编程的中级及以上开发者。 使用场景及目标:适用于需要在移动设备上进行高效图像识别的应用开发,如实时视频流中的物体检测、游戏内的道具识别等。目标是提高模板匹配的速度和准确性,同时确保在不同硬件配置下的稳定性和兼容性。 其他说明:文章提供了丰富的代码片段和实际案例,帮助读者更好地理解和应用所介绍的技术。特别强调了在不同ARM架构下的优化策略,为开发者提供了宝贵的参考资料。
内容概要:本文探讨了一种改进的粒子群优化(PSO)算法在微电网多目标优化调度中的应用。传统PSO在解决此类复杂问题时常陷入局部最优解,而改进版通过引入动态惯性因子和自适应变异操作,显著提升了算法性能。文中详细介绍了这两种改进措施的具体实现方法及其对算法收敛性和解质量的影响。此外,还展示了该算法在实际微电网调度任务中的表现,特别是在权衡经济成本与环境效益方面的能力。 适合人群:从事电力系统优化、智能电网研究的专业人士以及对进化算法感兴趣的学者和技术人员。 使用场景及目标:适用于需要进行高效能源管理的场合,如分布式发电系统的规划与运行。主要目的是寻找既能降低成本又能减少环境污染的最佳调度方案。 其他说明:文中提供了大量伪代码片段帮助读者理解具体的技术细节,并强调了参数调节对于最终结果的重要性。同时指出,该方法不仅限于微电网领域,还可以扩展应用于其他类型的优化问题。
Delphi 12.3控件之TeeChart Offline Keygen.7z
内容概要:本文详细介绍了如何利用MATLAB进行屈光度计算及其数据处理方法。首先解释了屈光度的基本概念和计算公式,接着展示了如何通过MATLAB代码读取、清理和转换焦距数据为屈光度,并进行了必要的单位转换。针对可能出现的异常值和噪声,文中提供了有效的数据清洗手段。此外,还探讨了如何对屈光度数据进行统计分析以及可视化呈现,如绘制趋势图和散点图等。最后,提到了将MATLAB代码转化为C++代码以便集成到硬件系统的高级应用。 适合人群:从事光学研究、眼科医疗设备开发的技术人员,以及对MATLAB有兴趣的学习者。 使用场景及目标:适用于需要精确处理和分析光学数据的研究机构或企业,旨在提高屈光度计算的效率和准确性,确保数据质量的同时优化实验结果。 其他说明:文中不仅涵盖了基本的操作步骤,还包括了许多实用的小贴士和技术细节,有助于读者更好地理解和掌握相关内容。同时强调了单位一致性的重要性,提醒开发者注意潜在的问题。
349421c2-4955-4132-b4da-808a3a171bfe.pdf
1744300906657718_download.jsp
【内容概要】 本文详细解析了企业筛选简历的“三重门”系统,包括ATS系统初筛、HR复核和业务部门终极评估三个阶段。首先,ATS系统作为关键词匹配引擎,强调了关键词的重要性及其优化方法;其次,HR在6秒内通过“薄片判断”评估简历的职业连贯性、成就量化和岗位匹配度;最后,业务部门则侧重于技术能力和文化适配性的综合评估。文章还揭示了各环节中的心理学原理和认知偏差,并提供了针对性的优化建议。 【适合人群】 正在求职或有求职打算的职场人士,尤其是希望提升简历通过率的求职者。 【使用场景及目标】 ①帮助求职者理解企业筛选简历的具体流程; ②提供简历优化的具体方法,如关键词优化、成就量化、案例准备等; ③指导求职者如何根据不同阶段的评审特点调整简历内容。 【其他说明】 文章结合了最新的招聘趋势研究报告和心理学理论,强调简历不仅是通过筛选的工具,更是展示个人能力和价值的平台。求职者应充分利用这些心理规律,打造更具吸引力的简历,为后续面试做好铺垫。
内容概要:本文详细介绍了使用PFC2D5.0进行二维岩石单轴压缩模拟的具体方法和代码实现。首先,通过设定模型的基本参数如颗粒生成、粘结设置、加载控制等,构建了一个完整的岩石样品模型。接着,深入探讨了加载过程中应力应变曲线的变化规律以及能量分析的方法,包括弹性应变能、动能和耗散能的监测。此外,还提供了裂隙统计的技术手段,能够精确捕捉岩石内部裂隙的发展情况。最后,强调了参数调整对模拟效果的影响,并给出了优化建议。 适合人群:从事岩土工程、地质力学研究的专业人士和技术爱好者。 使用场景及目标:适用于需要深入了解岩石力学特性的研究人员,帮助他们掌握PFC2D软件的应用技巧,提升科研能力。同时,也为相关领域的学生提供了一套实用的学习资料。 其他说明:文中提供的代码可以直接应用于PFC2D5.0环境,便于用户快速上手并进行实验验证。通过对不同参数的调整,可以模拟多种类型的岩石破坏行为,为实际工程项目提供理论支持。
内容概要:本文详细介绍了如何使用Fluent进行激光焊接的数值模拟,重点讲解了锥形高斯热源的建模方法。文章首先解释了锥形高斯热源的特点及其与普通高斯热源的区别,然后给出了具体的UDF代码实现,包括热源强度的计算、热流衰减的控制以及热源移动的实现。此外,还讨论了网格划分、材料参数设置、常见错误排查和优化技巧等方面的内容。通过实例和操作视频,帮助读者快速掌握激光焊接数值模拟的方法和技术要点。 适合人群:具有一定CFD基础并希望深入学习激光焊接数值模拟的研究人员和工程师。 使用场景及目标:适用于需要精确模拟激光焊接过程的研究项目或工业应用,旨在提高模拟精度,减少试验成本,优化焊接工艺参数。 其他说明:文中提供了大量实用的操作技巧和注意事项,如网格划分建议、材料参数选择、UDF代码调试等,有助于解决实际操作中可能遇到的问题。同时,附带的操作视频和GitHub上的完整案例包也为初学者提供了宝贵的学习资源。
序列化.md
"ResumePlatformFront 笔试面试全攻略与资源宝典"——一站式前端求职解决方案!精选高频笔试真题解析、大厂面试经验分享、实战项目模板及技能进阶指南,助你系统攻克前端求职难关。从简历优化到Offer谈判,覆盖求职全流程,配套免费资源库持续更新。无论应届生还是进阶开发者,这里都是你斩获心仪Offer的强力后盾!
weixin205微信小程序线上教育商城ssm(文档+源码)_kaic
内容概要:本文详细介绍了如何利用COMSOL软件构建岩石损伤与温度、渗流耦合的多物理场模型。首先解释了温度变化引起岩石膨胀/收缩以及渗流压力改变裂纹发展的物理机制,并通过PDE方程组进行描述。接着展示了具体的实现方法,如定义损伤变量、设置导热系数和渗透率随损伤变化的关系,以及引入温度修正的Mohr-Coulomb准则。文中还讨论了求解器配置技巧,强调了非线性收敛问题的解决方案。此外,作者分享了一些实际建模过程中遇到的问题及解决经验,如参数选择不当导致的模型发散等。 适合人群:从事岩土工程、地质工程及相关领域的研究人员和技术人员,特别是对多物理场耦合仿真感兴趣的学者。 使用场景及目标:适用于需要深入理解岩石在温度、渗流和应力共同作用下的损伤演化规律的研究项目。目标是帮助读者掌握COMSOL中多物理场耦合模型的建立方法,提高数值模拟的准确性。 其他说明:文章不仅提供了理论背景,还包括大量实用的代码片段和调试建议,有助于读者更好地理解和应用所学知识。
2023-04-06-项目笔记-第四百六十四阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.462局变量的作用域_462- 2025-04-10
内容概要:本文详细介绍了基于滑膜观测器的永磁同步电机(PMSM)无传感器控制技术及其在MATLAB/Simulink中的仿真实现。首先阐述了PMSM的特点及其在现代工业中的重要地位,接着重点讲解了转子磁场定向矢量控制(FOC)的工作原理,特别是电流环的设计和电压解耦的作用。然后深入探讨了一阶滑膜观测器的实现方法,展示了如何通过电机的电压和电流信号估计转子位置和速度。最后,通过搭建完整的Simulink仿真模型并运行仿真,评估了控制策略的性能,并提供了配套的英文文献以供进一步研究。 适合人群:从事电机控制系统设计的研发工程师和技术爱好者,尤其是对无传感器控制技术和滑膜观测器感兴趣的读者。 使用场景及目标:适用于希望深入了解PMSM无传感器控制技术的工程师,旨在帮助他们掌握滑膜观测器的设计和实现,提高系统的可靠性和降低成本。同时,也为后续的实际应用和优化提供了理论依据和技术支持。 其他说明:文中提供的代码片段和仿真模型有助于读者更好地理解和实践相关技术,而配套的英文文献则为深入研究提供了宝贵的参考资料。