- 浏览: 112468 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
一.什么是ThreadLocal?
ThreadLocal 是在 java.lang.包下的 在jdk1.2里引入进来 主要是给每个线程分配该线程本身的本地变量 该变量是该线程独有的 别的线程是访问不了的。
二. ThreadLocal的实现原理:
最关键的是在Thread类里有一个ThreadLocal.ThreadLocalMap threadLocals的属性,也就是说 一个线程对象生成的时候会有一个对应私有属性 threadLocals 生成 这个属性是一个 ThreadLocalMap 也就是MAP ,看ThreadLocal类的get方法:
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();
}
通过传入当前线程对象t会取得当前线程的 ThreadLocalMap 这个ThreadLocalMap key是ThreadLocal对象 值是我们传入的值OBJ,通过传入当前的ThreadLocal的对象tl(代码里的this)会取得该key对应的value就是我们set就去的对象 从而实现一个线程 有自己的独有的ThreadLocalMap 一个ThreadLocal可以取回自己作为key对应value(OBJ) 。ThreadLocalMap 可以多个key=>value(一个线程实例化多个ThreadLocal)。都是通过传递当前的Thread对象和当前的ThreadLocal对象实现取得唯一的值的。 具体如何实现请看源代码(ThreadLocal类 Thread类 ThreadLocal类里的内部类ThreadLocalMap)的各个方法 尤其是ThreadLocal类 的
get() set() remove() 等方法。
三.使用场景:
基本上需要在一个线程里保存上下文信息的 需要上下文切换的 比如session cookie等都可以用这个 spring 等框架也广泛使用了该技术。
四.注意事项:
1.在使用ThreadLocal的时候set完后线程执行完需要显性调用remove方法清除 不然在有线程池模式的WEB服务器下tomcat会出现 内存溢出和用户上下错乱(比如A用户拿到了B用户的SESSION)虽然同一个线程在执行到SET的时候会覆盖之前保留的值但是你无法控制其他人是否在SET之前有调用了。所以一定要在线程执行后remove.
PS:webx的filter和invoke都是递归调用的 第一个filter都是最先执行最后收尾的 invoke也类似。
ThreadLocal 是在 java.lang.包下的 在jdk1.2里引入进来 主要是给每个线程分配该线程本身的本地变量 该变量是该线程独有的 别的线程是访问不了的。
二. ThreadLocal的实现原理:
最关键的是在Thread类里有一个ThreadLocal.ThreadLocalMap threadLocals的属性,也就是说 一个线程对象生成的时候会有一个对应私有属性 threadLocals 生成 这个属性是一个 ThreadLocalMap 也就是MAP ,看ThreadLocal类的get方法:
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();
}
通过传入当前线程对象t会取得当前线程的 ThreadLocalMap 这个ThreadLocalMap key是ThreadLocal对象 值是我们传入的值OBJ,通过传入当前的ThreadLocal的对象tl(代码里的this)会取得该key对应的value就是我们set就去的对象 从而实现一个线程 有自己的独有的ThreadLocalMap 一个ThreadLocal可以取回自己作为key对应value(OBJ) 。ThreadLocalMap 可以多个key=>value(一个线程实例化多个ThreadLocal)。都是通过传递当前的Thread对象和当前的ThreadLocal对象实现取得唯一的值的。 具体如何实现请看源代码(ThreadLocal类 Thread类 ThreadLocal类里的内部类ThreadLocalMap)的各个方法 尤其是ThreadLocal类 的
get() set() remove() 等方法。
三.使用场景:
基本上需要在一个线程里保存上下文信息的 需要上下文切换的 比如session cookie等都可以用这个 spring 等框架也广泛使用了该技术。
四.注意事项:
1.在使用ThreadLocal的时候set完后线程执行完需要显性调用remove方法清除 不然在有线程池模式的WEB服务器下tomcat会出现 内存溢出和用户上下错乱(比如A用户拿到了B用户的SESSION)虽然同一个线程在执行到SET的时候会覆盖之前保留的值但是你无法控制其他人是否在SET之前有调用了。所以一定要在线程执行后remove.
PS:webx的filter和invoke都是递归调用的 第一个filter都是最先执行最后收尾的 invoke也类似。
发表评论
-
Java线程Dump分析工具--jstack(转摘纪录)
2015-10-29 10:47 872jstack用于打印出给 ... -
多角度看 Java 中的泛型
2014-05-13 15:40 759本文摘自:http://www.ibm.c ... -
java.lang.Object类 方法(转)
2014-05-13 10:55 2039Object类的方法 构造方法:public Obje ... -
为什么Java byte 类型的取值范围是-128~127(short int long同理)
2014-05-12 18:08 2123为什么Java byte 类型的取值范围是-128~127 ... -
web.xml之context-param,listener,filter, servlet启动顺序和讲解
2014-05-12 14:32 1022首先可以确定的一点是, 不同类型节点的加载顺序与它们在web. ... -
java对象初始化书序
2014-05-09 15:05 625package com.test.aa.service; p ... -
String Stringbuilder StringBuffer区别
2014-04-17 11:00 725关于这三者的区别,我们从官方API上很容易找到答案。 ... -
JAVA反射机制
2014-04-03 15:15 350JAVA反射机制: 通俗地说,反射机制就是可以把一个类, ... -
ArrayList和linkedList几种循环性能比较
2014-03-26 17:51 667请 参照 http://www.trinea.cn/andr ... -
HashMap原理
2014-03-20 15:31 570本文由 ImportNew - 唐小娟 ... -
java.lang.Cloneable
2014-03-20 11:22 635public interface Cloneable 此类实 ... -
Java集合框架学习总结
2014-03-14 16:43 750以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介绍 ... -
maven项目管理的一些知识
2014-03-04 16:24 582http://sishuok.com/forum/blogPo ... -
ehcache使用注意 及一些问题的解决
2014-02-21 17:35 883配置 1. applicationContext.xml ... -
Xms Xmx PermSize MaxPermSize 区别
2014-02-20 16:13 657Eclipse崩溃,错误提示: ... -
JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
2014-01-17 20:00 1146堆:顺序随意 栈:后进 ... -
debug遇到找不到源码的情况解决方案
2013-12-19 18:46 800在做JAVA开发的时候 页面端调用了接口服务端 找问题需要页面 ... -
工作学习2013-11-6
2013-11-06 20:20 5721.在用maven进行项目构建的时候 可以先建立以个maven ... -
运行jtest出现 No value found for property database.type 错误解决办法
2013-06-06 11:25 1814错误信息: Caused by: org.jtester.mo ...
相关推荐
### Java线程详解 #### 一、扩展`java.lang.Thread`类 在Java中实现多线程的一个方式是通过继承`java.lang.Thread`类。这种方式简单直观,但也有一定的局限性,比如不能再次继承其他类。 **示例代码**: ```java...
在应用服务器中使用Hibernate的注意事项 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect ...
在应用服务器中使用Hibernate的注意事项 12.3. JDO 12.3.1. 建立PersistenceManagerFactory 12.3.2. JdoTemplate和JdoDaoSupport 12.3.3. 基于原生的JDO API实现DAO 12.3.4. 事务管理 12.3.5. JdoDialect ...
Java中的单例模式有什么注意事项?** - 在多线程环境下,必须确保单例模式的线程安全性。 - 使用枚举(Enum)实现单例模式是一种简单且高效的方式,从Java 5开始支持。 - 需要注意懒汉式单例模式可能会带来的性能...
ASP技术访问WEB数据库.docx
2010-2019年上市公司排污费数据 1、时间:2010-2019年 2、来源:上市公司披露BG 3、指标:代码、日期、名称、本期支出 4、范围:417家上市公司 5、相关研究:胡珺,宋献中,王红建.非正式制度、家乡认同与企业环境治理
内容概要:本文详细介绍了六轴桌面机械臂的上位机(PC)和下位机(单片机)源码实现及其应用场景。上位机使用Python编写,通过pyserial库进行串口通信,实现了用户交互和指令发送功能;下位机则使用Arduino平台,通过C/C++语言编写代码,实现了机械臂的动作控制。文中不仅展示了基本的通信协议和控制逻辑,还深入探讨了逆运动学计算、PID控制、数据同步等问题,并提供了多个实用的代码片段和调试经验。 适合人群:对机器人技术和嵌入式开发感兴趣的开发者,尤其是有一定编程基础和技术背景的人群。 使用场景及目标:适用于六轴桌面机械臂的开发和调试,帮助读者理解上下位机的协同工作原理,掌握机械臂控制的关键技术,如串口通信、逆运动学、PID调节等。 其他说明:文章强调了实际开发中的注意事项和常见问题,如数据同步、指令校验、运动规划等,并提供了一些优化建议和解决方案。此外,还提到了系统的扩展性和安全性措施,如限位保护和扩展接口的设计。
青藏高原降水的水汽来源及输送机制一直是国际水文气候学界关注的热点问题。由于高原地面观测站数量有限,且分布极不均匀,从而导致降水溯源存在很大不确定性。作者通过引入卫星降水数据来弥补站点观测降水的不足,从而对高原整体降水的水汽来源进行模拟性评估。作者通过1998-2018年间水汽追踪数值模型模拟高原整体降水的水汽来源,模型使用ERA-Interim再分析资料、TRMM卫星降水和GLDAS OAFlux蒸发作为数据驱动,并设置对比实验进行验证,最终生成高原整体降水的水汽来源月尺度数据。数据集内容包括:(1)青藏高原范围;(2)高原1998-2018年逐月降水水汽贡献数据,空间分辨率为1°×1°,单位:mm/mon;(3)高原1998-2018年逐月降水量。数据集存储为.nc、.shp和.xlsx格式,由8个数据文件组成,数据量为55 MB(压缩为1个文件,40.9 MB)。基于该数据集的分析研究成果已发表在《Environmental Research Letters》2020年15卷。Zhang, C. Moisture source assessment and the varying characteristics for the Tibetan Plateau precipitation using TRMM [J]. Environmental Research Letters, 2020, 15(10): 104003.
内容概要:本文详细介绍了利用MotorCAD进行32极36槽内转子永磁同步电机的设计过程,涵盖电磁场计算、极槽配合选择、绕组设计、磁钢布局、冷却系统设计等方面。通过分数槽配置、双层短距绕组、V型磁钢布局以及高效的冷却系统,实现了70kW输出、525rpm转速、2.5倍过载能力和高达5kW/kg的功率密度。文中还讨论了具体的参数设置及其背后的物理意义,如极距、绕组因数、磁钢涡流损耗控制等。 适合人群:从事电机设计的专业工程师和技术人员,尤其是对高功率密度和高性能电机感兴趣的读者。 使用场景及目标:适用于电动工程机械等需要短时爆发力的应用场合,旨在提高电机的功率密度和过载能力,同时确保高效稳定运行。 其他说明:文章提供了详细的参数配置代码片段,便于读者理解和复现设计过程。此外,还分享了一些实用的设计经验和优化技巧,如磁钢分段设计、转子冲片造型等。
标题Python网络课程在线学习平台研究AI更换标题第1章引言介绍Python网络课程在线学习平台的研究背景、意义、国内外现状和研究方法。1.1研究背景与意义阐述Python在线学习平台的重要性和研究意义。1.2国内外研究现状概述国内外Python在线学习平台的发展现状。1.3研究方法与论文结构介绍本文的研究方法和整体论文结构。第2章相关理论总结在线学习平台及Python教育的相关理论。2.1在线学习平台概述介绍在线学习平台的基本概念、特点和发展趋势。2.2Python教育理论阐述Python语言教学的理论和方法。2.3技术支持理论讨论构建在线学习平台所需的技术支持理论。第3章Python网络课程在线学习平台设计详细介绍Python网络课程在线学习平台的设计方案。3.1平台功能设计阐述平台的核心功能,如课程管理、用户管理、学习跟踪等。3.2平台架构设计给出平台的整体架构,包括前后端设计、数据库设计等。3.3平台界面设计介绍平台的用户界面设计,强调用户体验和易用性。第4章平台实现与测试详细阐述Python网络课程在线学习平台的实现过程和测试方法。4.1平台实现介绍平台的开发环境、技术栈和实现细节。4.2平台测试对平台进行功能测试、性能测试和安全测试,确保平台稳定可靠。第5章平台应用与效果分析分析Python网络课程在线学习平台在实际应用中的效果。5.1平台应用案例介绍平台在实际教学或培训中的应用案例。5.2效果评估与分析通过数据分析和用户反馈,评估平台的应用效果。第6章结论与展望总结Python网络课程在线学习平台的研究成果,并展望未来发展方向。6.1研究结论概括本文关于Python在线学习平台的研究结论。6.2研究展望提出未来Python在线学习平台的研究方向和发展建议。
内容概要:本文详细介绍了为西门子S7-1200 PLC开发的一个自定义堆栈程序。由于S7-1200未提供内置堆栈功能,作者使用SCL(Structured Control Language)编写了一个通用型堆栈功能块(FB),能够实现FIFO(先进先出)和LIFO(后进先出)的数据管理。该堆栈程序支持多种数据类型(如BOOL、REAL、DWORD等),并提供了入栈、出栈、清空等功能。文中还讨论了具体的实现细节,如边界检测、指针管理和环形缓冲区的设计,以及在实际工业环境中的应用效果。 适合人群:从事PLC编程、自动化控制系统开发的技术人员,尤其是熟悉西门子S7-1200系列PLC的工程师。 使用场景及目标:适用于需要临时存储和管理数据的应用场景,如生产线上的配方管理、设备故障回溯、日志记录等。通过自定义堆栈程序,可以提高数据处理效率,减少因缺乏内置堆栈功能而带来的不便。 其他说明:该堆栈程序已在实际生产环境中运行超过三个月,处理了大量数据,表现出良好的稳定性和性能。未来计划进一步优化,如改进为环形缓冲区以提升性能。
GIS在林业管理系统中的应用.pdf
C语言专业课程设计销售标准管理系统.doc
基于 Python 的高校学生职业推荐系统的设计与实现LW+PPT
内容概要:本文详细介绍了基于Simulink平台构建的电动汽车仿真模型,涵盖整车动力性测试(如最高车速、最大爬坡能力和加速时间)和NEDC工况下的能耗测试。模型由驾驶员模型、VCU控制模型、电机系统和电池系统四个主要部分构成,通过协同工作完成各项性能指标的仿真测试。文中还展示了多个关键环节的具体实现细节,如PID控制、扭矩限制、电池能量管理等。 适合人群:从事电动汽车研发的技术人员、高校相关专业师生、对电动汽车仿真感兴趣的工程爱好者。 使用场景及目标:①用于电动汽车的设计阶段,评估不同设计方案的动力性能和能耗水平;②作为教学工具,帮助学生理解电动汽车的工作原理和技术难点;③为企业提供技术支持,优化现有车型的性能表现。 其他说明:文中提供了大量MATLAB/Simulink代码片段,便于读者理解和复现实验结果。同时强调了模型的实际应用价值及其对未来电动汽车发展的指导意义。
2025年计算机二级考试C试卷及答案.doc
标题Django基于Python的毕业生去向反馈调查平台设计与实现AI更换标题第1章引言介绍研究背景、意义,分析国内外相关平台的现状,并阐述论文的研究方法和创新点。1.1研究背景与意义说明毕业生去向反馈的重要性及现有调查方式的不足。1.2国内外研究现状概述国内外在毕业生去向反馈调查平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在平台设计中的创新之处。第2章相关理论与技术介绍Django框架、Python语言以及相关的Web开发技术。2.1Django框架概述简述Django框架的特点、优势及其在Web开发中的应用。2.2Python语言基础概述Python语言的基本语法、特点及其在Web开发中的作用。2.3Web开发相关技术介绍与平台设计相关的Web前端技术、数据库技术等。第3章平台需求分析对毕业生去向反馈调查平台进行需求分析,包括功能需求和非功能需求。3.1功能需求分析详细阐述平台应具备的各项功能,如用户管理、问卷调查、数据分析等。3.2非功能需求分析分析平台的性能、安全性、易用性等非功能需求。第4章平台设计根据需求分析结果,设计平台的整体架构、功能模块和数据库。4.1平台整体架构设计给出平台的整体架构图,并说明各个组成部分的作用。4.2功能模块设计详细设计平台的各个功能模块,包括用户模块、问卷模块、数据分析模块等。4.3数据库设计设计平台的数据库结构,包括数据表的设计、数据关系的建立等。第5章平台实现与测试介绍平台的实现过程、关键代码以及测试方法和结果。5.1平台实现阐述平台的实现过程,包括开发环境的搭建、代码的编写等。5.2关键代码展示展示实现平台功能的关键代码片段,如用户认证、问卷调查等。5.3平台测试说明平台的测试方法,包括功能测试、性能测试等,并给出测试结果。第6章结论与展望总结论文的研究成果,指出平台的优点与不足,并展望未来的研究方向。6.
内容概要:本文详细介绍了使用C#实现TCP/IP客户端与服务器之间的数据交互,涵盖字节、整型、浮点数、字符串等多种数据类型的处理,并特别强调了中英文字符串的交互功能。此外,文章深入探讨了与西门子S7-200Smart工业设备的通讯方式,包括协议适配、字节序处理、数据帧构建等关键技术点。文中提供了丰富的代码示例,如TcpListener的初始化、客户端连接、数据读取与发送、以及针对工业设备的特殊数据处理方法。同时,作者分享了许多实践经验,如避免字节序错误、处理浮点数精度问题、使用Wireshark抓包工具等。 适合人群:具有一定C#编程基础,尤其是对网络编程和工业自动化感兴趣的开发者和技术爱好者。 使用场景及目标:适用于需要实现C# TCP/IP通信的项目,特别是涉及工业设备通讯的场景。目标是掌握TCP/IP通信的基本原理及其在工业自动化领域的应用,能够独立完成与西门子S7-200Smart设备的通讯开发。 其他说明:文章不仅提供理论讲解,还有大量实战代码和技巧分享,帮助读者快速理解和应用所学知识。建议读者在实践中结合Wireshark等工具进行调试,以便更好地理解数据传输过程。
腹部CT扫描 用于检测癌症的轴向切片 腹部CT扫描数据集 用于检测癌症的轴向切片 欢迎使用这个强大的数据集,该数据集以腹部CT扫描的轴向切片为特色,在诊断癌症的过程中收集。 该资源是医学影像爱好者的金矿,非常适合推进医疗技术的研究和构建创新工具! 该数据集包含在轴向切片中采集的腹部计算机断层扫描(CT),最初是为了识别癌症的体征而采集的。无论您是从事医学成像、图像分割还是自动诊断,这些图像都为探索和创新提供了绝佳的机会。 里面是什么? 可能是带有CT扫描的ZIP文件](93.9 MB)一个压缩的档案,其中包含腹部CT图像,可能是DICOM或其他标准医疗格式。打开它以显示完整的收藏! 你如何使用它 通过这些激动人心的应用程序释放您的创造力: 胃癌症检测:建立和测试算法,像专业人士一样在CT扫描中发现癌症迹象。 图像分割:掌握精确勾勒腹部器官和潜在肿瘤的艺术。 医学影像研究:突破CT图像分析和处理技术的界限。 标签 医学影像·图像分割·癌症·CT扫描
内容概要:本文详细介绍了基于西门子S7-224XP PLC和昆仑通态触摸屏的恒压供水一拖二控制系统。该系统不仅支持工频和变频切换,还能作为纯变频方案使用。硬件方面,采用224XP带两个串口连接触摸屏和MODBUS通讯,配备EM232模拟量输出模块发送控制信号。软件部分展示了关键的梯形图代码,包括主泵切换逻辑、双PID调节、工变频互锁等。此外,还提供了触摸屏组态建议,确保系统的高扩展性和灵活性。文中强调了调试技巧和注意事项,如模拟量输出的软件滤波、变频器故障信号隔离等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和恒压供水系统感兴趣的读者。 使用场景及目标:适用于需要主备泵轮换或同时运行的恒压供水系统。目标是帮助工程师理解和实施高效稳定的工变频互锁控制方案,提高系统的可靠性和适应性。 其他说明:文中提到的具体代码片段和硬件配置有助于实际项目的快速部署和调试。对于希望深入了解PLC编程和恒压供水系统的人来说,本文提供了宝贵的实践经验和技术细节。