1.ThreadLocal是什么?
从命名角度出发,可以理解为 thread local value(线程局部变量),即为每个线程提供局部变量。与同步机制共享一些变量不同,但是都是可以解决多线程并发的问题,只是二者面向的问题领域不同而已。
2.ThreadLocal实现机制?
查看java.lang.ThreadLocal源代码,我们可以知道其实是使用Map,存储每个线程的副本。
package java.lang;
import java.lang.ref.*;
import java.util.concurrent.atomic.AtomicInteger;
public class ThreadLocal<T> {
...
//初始化变量,子类可重写此方法
protected T initialValue() {
return null;
}
//返回此线程局部变量的当前线程副本中的值。
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();
}
//将此线程局部变量的当前线程副本中的值设置为指定值。
public void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null)
map.set(this, value);
else
createMap(t, value);
}
//移除此线程局部变量当前线程的值。
public void remove() {
ThreadLocalMap m = getMap(Thread.currentThread());
if (m != null)
m.remove(this);
}
...
}
3.ThreadLocal 的使用
-
结合单例模式,不同的线程调用get()获得自己的线程中的对象
import java.util.Vector;
public class SGThreadLocalContext {
private static ThreadLocal<SGThreadLocalContext> threadLocals = new ThreadLocal<SGThreadLocalContext>();
public static SGThreadLocalContext get() {
SGThreadLocalContext context = threadLocals.get();
if (context == null) {
context = new SGThreadLocalContext();
threadLocals.set(context);
}
return context;
}
//属性
private String smallGroupAppID;
private String userContext;
public String getSmallGroupAppID() {return smallGroupAppID;}
public void setSmallGroupAppID(String smallGroupAppID) {
this.smallGroupAppID = smallGroupAppID;
}
public String getUserContext() {return userContext;}
public void setUserContext(String userContext) {
this.userContext = userContext;
}
}
-
Hibernate中,ThreadLocal管理多线程,保证每个线程都有自己的数据库连接
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() {
Session s = (Session)session.get();
//open a new session,if this session has none
if(s == null){
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
package thread;
import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LoggerThreadTest {
private static final ThreadLocal threadLocal = new ThreadLocal();
public static void log(String msg) {
getThreadLogger().log(Level.INFO, msg);
}
private static Logger getThreadLogger() {
Logger logger = (Logger) threadLocal.get();
if(logger == null) {
try {
logger = Logger.getLogger(Thread.currentThread().getName());
// Logger 默认在控制台输出,添加文件输出处理器,输出XML格式
logger.addHandler(
new FileHandler( Thread.currentThread().getName() + ".log")
);
}catch(IOException e) {
e.printStackTrace();
}
threadLocal.set(logger);
}
return logger;
}
/**
* 测试日志
* @param args
*/
public static void main(String[] args) {
new Test("thread1").start();
new Test("thread2").start();
new Test("thread3").start();
}
}
class Test extends Thread {
public Test(String name) {
super(name);
}
public void run() {
for(int i = 0; i < 10; i++) {
LoggerThreadTest.log(getName() + ": message " + i);
try {
Thread.sleep(1000);
}
catch(Exception e) {
LoggerThreadTest.log(e.toString());
}
}
}
}
分享到:
相关推荐
ThreadLocal是Java中用于处理线程安全问题的一种机制,Spring利用ThreadLocal为每个线程提供单独的变量副本,避免了多线程环境中的并发问题。例如,Spring使用ThreadLocal来存储事务相关的信息,确保在同一个请求...
- `java.util.concurrent`包提供了如`ExecutorService`、`Future`、`Callable`、`ThreadLocal`等高级并发工具,帮助开发者更安全、高效地管理线程和任务。 10. **并发设计模式** - 生产者消费者模式、读写锁模式...
以下是我从我的读书笔记中整理出的一些容易被忽视的Java学习知识点。 1. **基本概念理解**:Java是一种面向对象的语言,但很多初学者会混淆面向过程和面向对象的区别。理解类、对象、继承、封装和多态等核心概念是...
市场营销计划书.docx
电缆叉绞机sw18_三维3D设计图纸.zip
(WORD) 土木工程专业毕业设计开题报告 办公楼设计 开题报告.doc
内容概要:本文详细介绍了云南某矿区采用碳捕集与电转气(P2G)技术进行综合能源系统优化调度的研究。通过实例展示了如何利用瓦斯、余热等伴生能源,结合碳捕集和P2G技术,实现了矿区能源系统的高效利用和低碳转型。文中提供了具体的Python代码示例,如瓦斯热值转换、碳捕集与P2G的耦合约束、阶梯式碳机制等,展示了技术细节和优化效果。此外,还讨论了风光消纳率提升、碳交易收益以及系统总成本降低等方面的内容。 适合人群:从事能源系统优化、碳捕集技术和电转气技术研发的专业人士,以及对低碳经济感兴趣的科研人员。 使用场景及目标:适用于希望了解和应用碳捕集与电转气技术进行矿区能源系统优化的企业和技术团队。目标是提高能源利用效率,减少碳排放,降低成本。 其他说明:文章不仅提供了理论模型和算法,还包括了实际项目中的代码实现和优化结果,有助于读者更好地理解和应用相关技术。
卧式长轴切割机sw20可编辑_三维3D设计图纸_三维3D设计图纸.zip
基于单片机protues仿真制作的超高精度电参数测试(仿真图、源代码) 这次设计的课题,智能电参数测试电路是基于单片机,控制外部器件进行操作的。利用protues软件进行局部电路的描绘。然后在使用Keil4软件针对protues仿真部分作出代码控制程序,经过编译,修改调试生成hex文件。最后再把.hex文件加载到protues中ATC80C52单片机芯片系统中,运行硬件仿真电路,做完局部仿真后。最后将部分电路进行模块化处理。最后整合在一块,通过外部中断切换显示各个模块测试的结果数据。 1、单片机仿真; 2、液晶屏或者数码管显示; 3、电流、电压、电阻测量和显示; 4、超高精度电参数测试; 5、仿真图、源代码;
内容概要:本文详细介绍了如何利用西门子1200PLC进行脉冲除尘系统的控制。首先描述了硬件配置,包括PLC主模块、数字量扩展模块以及电磁阀组的连接方式。接着深入探讨了核心控制逻辑的实现,采用SCL语言编写控制程序,实现了分组控制、定时器配置、故障诊断等功能。文中还提供了具体的代码示例,展示了如何通过定时器、脉冲发生器等组件精确控制脉冲阀的工作周期和顺序,确保除尘系统的高效运行。此外,文章分享了一些实际调试过程中遇到的问题及其解决方案,如脉冲宽度设置不当导致的空压机过载、电磁阀内部触点粘连等问题,并提出了相应的预防措施。 适合人群:从事工业自动化领域的工程师和技术人员,特别是熟悉PLC编程和脉冲控制系统的从业者。 使用场景及目标:适用于需要设计和实施高效脉冲除尘控制系统的工厂环境,旨在提高除尘效率,降低能耗,延长设备使用寿命。通过学习本文,读者能够掌握如何使用西门子1200PLC实现复杂的脉冲控制逻辑,解决实际工程中可能遇到的各种问题。 其他说明:文章不仅提供了详细的代码示例,还强调了实际应用中的注意事项和调试技巧,帮助读者更好地理解和应用所学知识。
汽车开关测试台sw23_三维3D设计图纸_三维3D设计图纸.zip
双面锯片磨sw18可编辑_三维3D设计图纸_三维3D设计图纸.zip
模块化除臭生物箱sw18可编辑_三维3D设计图纸_三维3D设计图纸.zip
内容概要:本文介绍了基于矢量延迟锁定环(VDLL)的GPS信号跟踪算法的MATLAB仿真实现。首先,通过生成带有多普勒频移和码相位抖动的GPS中频信号,模拟真实场景。接着,详细阐述了VDLL的核心实现,包括超前即时滞后三路相关、误差计算、状态预测和卡尔曼滤波的应用。文中强调了环路滤波器带宽的自适应调整和动态应力测试的重要性,并展示了仿真结果,证明VDLL在高动态环境下的优越性能。最后,提供了完整的代码包和设计文档,涵盖信号生成、本地信号发生器、相关器组、EKF实现、性能评估和可视化工具等多个模块。 适合人群:从事GPS信号处理、无线通信系统设计的研究人员和技术开发者,尤其是对高动态环境下的信号跟踪感兴趣的工程师。 使用场景及目标:适用于需要提高GPS信号跟踪稳定性和精度的场合,如车载导航、航空导航等领域。目标是通过矢量化处理和动态调整,增强系统的抗干扰能力和跟踪稳定性。 其他说明:文中提到的关键技术和实现细节对于理解和优化GPS信号跟踪算法非常有价值。此外,提供的代码包和设计文档可以作为进一步研究的基础。
数据说明: 该数据集包含8种巴基斯坦芒果的图像2200张。在提出的数据集上进行实验,对收获的芒果进行自动分类和分级,以帮助农民及时交付高质量的芒果供出口,并使用卷积神经网络实现了高准确性。 研究人员和学生可以使用这个数据集来开发、测试和评估不同的计算机视觉算法,为改善农业部门作出贡献。所提供的数据集可被视为测试和比较不同技术水平性能的基准。
时间轮源码
内容概要:本文详细介绍了光伏混合储能系统的虚拟同步发电机(VSG)并网仿真模型。该系统由VSG控制模块、光伏PV模块、蓄电池以及超级电容组成。VSG通过有功-频率环和无功-电压环进行精确控制,确保系统稳定运行。光伏模块采用MPPT扰动观察法跟踪最大功率点,蓄电池提供稳定的恒功率输出,超级电容则用于快速响应瞬态负载变化。文中展示了各个模块的核心代码逻辑及其在仿真环境中的表现,强调了参数整定对系统性能的影响。 适合人群:电力电子工程师、新能源研究人员、仿真建模专家。 使用场景及目标:适用于研究光伏混合储能系统的并网控制策略,优化储能设备的协同工作,提高系统的稳定性和响应速度。目标是通过仿真验证系统在各种工况下的性能,为实际应用提供理论支持和技术指导。 其他说明:文章提供了丰富的代码片段和仿真案例,帮助读者深入理解各模块的工作原理和相互关系。同时,作者分享了许多调试经验和常见错误,有助于新手更快掌握相关技术。
电大土木工程毕业设计施工组织设计_图文.doc
报价单封面建筑土木工程.doc
内容概要:本文详细介绍了如何通过485通讯实现西门子S7-200 SMART PLC与三台台达DT330温控器的通信,并结合昆仑通态触摸屏实现温度监控与设定。主要内容涵盖硬件连接、温控器设置、PLC程序设计(包括初始化、轮询读取温度、中断接收处理、设置温控器温度)、触摸屏设置及常见问题解决方法。文中还特别强调了Modbus RTU轮询机制的应用及其重要性。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是那些需要实现PLC与温控器通信的人群。 使用场景及目标:适用于需要精确控制和监测温度的工业环境,如生产车间、实验室等。目标是提供一种稳定可靠的技术方案,确保不同设备间能够高效通信,从而实现精准的温度控制。 其他说明:文中提供的具体代码片段和配置指南有助于读者更好地理解和实施该项目。此外,作者还分享了一些调试过程中遇到的问题及解决方案,帮助读者规避潜在的风险。