threadLocal可以避免在多线程程序中使用大量的synchronied同步锁,因为这样会降低性能,将会有多线程安全问题的变量放到threadLocal中就ok了
Spring控制的service层 dao层对象都是单例的,spring用threadlocal的方式将所有成员变量管理起来,所以不存在多线程问题
-------------------------
在web应用中,将用户信息存放在session中,只有Action层才能拿到用户信息,service层,DB层, DB Interceptor层 要取得用户信息的话,适合使用ThreadLocal。
ThreadLocal的机制是将浏览器发送的request线程 和 本地线程做绑定。以取得数据共享。
GlobalDate 是一个带有ThreadLocal的容器。
GlobalData 最好放在 过滤器中, 而不是放在BaseAction的构造方法中
因为如果action是单例的话, 不会每次request请求 都调用其构造方法
DWR 查询请求也是request请求,也会经过过滤器, 所以用过滤器的方式可行。
package cia.common.base.bean;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.Logger;
import cia.common.base.constants.Constants;
import cia.common.base.exception.DomainException;
public class GlobalData implements Serializable {
private static final long serialVersionUID = 1L;
private static ThreadLocal session = new ThreadLocal();
private BaseUserInfo baseUserInfo;
private String ip;
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public BaseUserInfo getBaseUserInfo() {
return baseUserInfo;
}
public void setBaseUserInfo(BaseUserInfo baseUserInfo) {
this.baseUserInfo = baseUserInfo;
}
public static GlobalData getCurrentInstance() throws DomainException {
GlobalData gi = (GlobalData) session.get();
return gi;
}
public static GlobalData getCurrentInstanceWithoutException() {
GlobalData gi = (GlobalData) session.get();
return gi;
}
public static void setCurrentInstance(GlobalData gi) {
session.set(gi);
}
public static GlobalData getFromRequest(HttpServletRequest request) throws DomainException{
HttpSession httpSession = request.getSession(false);
GlobalData globalInfo = (GlobalData) httpSession
.getAttribute(Constants.GLOBAL_DATA);
return globalInfo;
}
}
BaseAction中将request和GlobalData做绑定。
public BaseAction(){
try {
HttpServletRequest request = ServletActionContext.getRequest();
GlobalData globalInfo = GlobalData.getFromRequest(request);
GlobalData.setCurrentInstance(globalInfo);
} catch(NullPointerException e){
//不处理该异常
logger.info(""+e.getMessage());
} catch (Exception e) {
logger.error("异常:"+e.getMessage(),e);
}
}
Service层使用的时候,从GlobalData中拿数据。
GlobalData globalInfo = GlobalData.getCurrentInstance();
BaseUserInfo userInfo = globalInfo.getBaseUserInfo();
分享到:
相关推荐
总结:`ThreadLocal` 是一个强大的工具,但在使用时必须谨慎,尤其是在多线程环境中,如 Tomcat 这样的 Web 容器。如果不正确地管理 `ThreadLocal` 的生命周期,可能导致类加载器级别的内存泄漏。理解 `ThreadLocal`...
#### 六、总结 `ThreadLocal`是一种强大的工具,它简化了多线程编程中对线程局部数据的管理,提高了代码的可读性和可维护性。然而,不当的使用也可能导致内存泄漏和其他潜在问题。因此,在使用`ThreadLocal`时,...
总结一下,Java事务和ThreadLocal都是Java多线程编程中不可或缺的工具。事务用于保证数据库操作的原子性和一致性,ThreadLocal则为每个线程提供了独立的数据空间,避免了线程间的数据冲突。理解并熟练运用这两个概念...
### 六、总结 `ThreadLocal`是Java中用于解决线程间数据隔离的有效工具。通过为每个线程创建独立的变量副本,它不仅简化了代码,还提高了程序的可维护性和安全性。需要注意的是,尽管使用了弱引用来避免内存泄漏,...
总结一下,这份资料涵盖了设计模式中的单例模式、工厂模式和代理模式,以及Java中的ThreadLocal特性。理解并熟练应用这些概念和技术,对于提升Java开发者的技能水平,优化代码的可读性和可维护性具有重要作用。在...
总结,ThreadLocal是Java中处理线程局部数据的利器,特别适用于需要线程隔离的场景,如Web应用中的session管理。通过合理使用ThreadLocal,可以提升程序的并发性能并保证数据安全性。但同时,需要注意内存管理和避免...
总结,`ThreadLocal`是Java中用于实现线程局部变量的工具,它提供了一种简单的方式在多线程环境下隔离数据,避免了传统的同步机制。但是,使用时需注意其潜在的内存泄漏风险和对代码可读性的影响,合理地选择使用...
总结起来,ThreadLocal和Spring的事务管理是Java开发中解决并发问题和保证数据一致性的重要手段。熟练掌握这两个概念,有助于构建稳定、高效的分布式系统。通过深入学习源码和实际应用,我们可以更好地理解其工作...
总结来说,这个小型练习展示了如何在Java Web应用中有效地结合c3p0数据源、ThreadLocal和事务管理,以实现安全、高效的转账操作。ThreadLocal提供了线程安全的变量管理,c3p0优化了数据库连接的使用,而事务则保证了...
总结来说,ThreadLocal是Java中解决多线程数据隔离问题的有效工具,通过为每个线程提供独立的变量副本,它能够在不引入复杂同步机制的情况下,实现线程安全的代码编写。在设计需要线程安全的类或组件时,ThreadLocal...
#### 六、总结 通过以上分析,我们可以看到`ThreadLocal`为多线程环境下的编程提供了一种简洁优雅的解决方案。它不仅能够避免复杂的同步问题,还能有效地管理线程间的变量隔离。理解`ThreadLocal`的工作原理及其...
ThreadLocal的实现原理可以总结为:每个线程都有一个自己的ThreadLocalMap,用于存放线程的本地变量;ThreadLocal的set、get、remove方法都是基于ThreadLocalMap的操作。 ThreadLocal的优点是可以解决多线程访问...
总结起来,ThreadLocal的核心是通过每个线程内部的ThreadLocalMap来实现变量的线程隔离。它简化了线程安全的处理,允许在多线程环境中为每个线程提供独立的变量副本,而无需同步。理解和掌握ThreadLocal的工作原理...
总结起来,ThreadLocal是Java中实现线程局部变量的一种机制,它使得线程间的数据独立,避免了并发编程中的数据共享问题,简化了多线程环境下的状态管理。然而,使用ThreadLocal时必须注意内存管理和对象的生命周期,...
目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现...注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...
总结起来,"Hibernage_Session_Manager_ThreadLocal"是一个关于使用ThreadLocal在多线程环境中优化Hibernate Session管理的技术实践,通过这种方式可以提升应用程序的性能和安全性。`HibernateUtil.java`是实现这一...
总结来说,Java线程编程中的ThreadLocal类提供了一种高效、便捷的方式来实现线程间的隔离数据,但同时也需要开发者注意其潜在的内存泄漏风险。正确理解和使用ThreadLocal,能够帮助我们编写出更加健壮、高效的并发...
总结,ThreadLocal 提供了一种线程隔离的变量存储方式,而 Java 中的四种引用类型则帮助我们更好地控制对象的生命周期和内存管理,理解这些概念对于理解和使用 ThreadLocal 至关重要,同时也是面试中经常考察的知识...