关于java Servlet,Struts,springMVC 的线程安全问题
现在主流的java的前端框架有:struts1,struts2,springmvc 还有最根本的servlet;
前些天一个朋友问我这方面的问题,就研究一番:
1.关于struts1:
Struts1使用的ActionServlet是单例的,由这一个servlet处理所有.do请求。RequestProcessor也是单例。
RequestProcessor的processActionCreate方法:
/** * <p>Return an <code>Action</code> instance that will be used to process * the current request, creating a new one if necessary.</p> * * @param request The servlet request we are processing * @param response The servlet response we are creating * @param mapping The mapping we are using * @return An <code>Action</code> instance that will be used to process * the current request. * @throws IOException if an input/output error occurs */ protected Action processActionCreate(HttpServletRequest request, HttpServletResponse response, ActionMapping mapping) throws IOException { // Acquire the Action instance we will be using (if there is one) String className = mapping.getType(); if (log.isDebugEnabled()) { log.debug(" Looking for Action instance for class " + className); } Action instance; // 这个同步快保证了Action的单例 synchronized (actions) { // Return any existing Action instance of this class instance = (Action) actions.get(className); if (instance != null) { if (log.isTraceEnabled()) { log.trace(" Returning existing Action instance"); } return (instance); } // Create and return a new Action instance if (log.isTraceEnabled()) { log.trace(" Creating new Action instance"); } try { instance = (Action) RequestUtils.applicationInstance(className); // Maybe we should propagate this exception // instead of returning null. } catch (Exception e) { log.error(getInternal().getMessage("actionCreate", mapping.getPath()), e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, getInternal().getMessage("actionCreate", mapping.getPath())); return (null); } actions.put(className, instance); if (instance.getServlet() == null) { instance.setServlet(this.servlet); } } return (instance); }
从结果可以知道,是单例,既然是单例,如果当使用实例变量的时候就会有线程安全的问题;
2.关于struts2
我们知道我们使用struts2的时候,都是使用actionContext ;都是使用里面的实例变量,让struts2自动匹配成对象的。 如果不是线程安全那全完了;所以struts2必须是线程安全的; 因为每次处理一个请求,struts就会实例化一个对象;这样就不会有线程安全的问题了;
哦,忘记了一种情况,struts2+spring来管理注入的时候;如果把action设置为单例模式,就会出现问题;可以把action设置为prototype类型,还有一个办法是设置作用域(具体没有实验过)
3.关于SpringMVC
SpringMVC的controller默认是单例模式的,所以也会有多线程并发的问题;
参考代码:
@RequestMapping("/user") @Controller Class UserController { @Resource UserService userService; @RequestMapping("/add") public void testA(User user){ userService.add(user); } @RequestMapping("/get") public void testA(int id){ userService.get(id); } } @Service("userService") Class UserService{ public static Map<Integer,User> usersCache = new HashMap<String,User>(); public void add(User user){ usersCache.put(user.getId(),user); } public void get(int id){ usersCache.get(id); } }
usersCache就是非线程安全的。
解决方法:
1)同步共享数据
2)不使用成员实例变量;
3)使用只读数据
相关推荐
SpringMVC和Hibernate是Java开发中两个非常重要的框架,它们分别负责Web应用的视图-控制器层和数据持久化层。...然而,整合过程中需要注意线程安全问题,以及优化数据库查询性能,避免N+1查询等问题。
SpringMVC4.2版本包含了诸如支持JSR-356 WebSockets、改进的类型安全的模型绑定以及更强大的异常处理机制等增强功能。 在"testMavenWeb"这个项目中,我们可以预见到以下的整合流程: 1. 配置Spring:首先,我们...
SessionFactory是线程安全的工厂,用于创建Session;Session则是与数据库交互的主要接口,支持CRUD操作。Hibernate还提供了Query和Criteria API来进行复杂的查询。 Spring框架提供了IoC(Inversion of Control)...
**问题十:SpringMvc的控制器是不是单例模式,如果是,有什么问题,怎么解决?** - 控制器默认是单例模式。 - 如果需要每个请求创建一个新的实例,可以使用`@Scope("prototype")`。 **问题十一:SpringMVC常用的注解...
Hashtable是线程安全的,HashMap非线程安全但性能较高,LinkedHashMap保持插入顺序,TreeMap则根据键进行排序。 在SQL中,事务(Transaction)是一组数据库操作的逻辑单元,确保数据一致性。事务包含DML(Data ...
本文总结了 Java 软件工程师面试的基本问题,涵盖了 SpringMVC、MyBatis、Java 线程安全、Spring 的 IOC 和 AOP、Java 多态、String 和 StringBuffer、HashMap 和 Hashtable、MySQL 等多个方面。 一、SpringMVC * ...
Spring作为基础框架,它通过IOC(Inversion of Control)和AOP(Aspect-Oriented Programming)两大核心理念,实现了对应用程序组件的解耦和管理。IOC使得对象之间的依赖关系由容器负责管理和维护,而AOP则允许...
SpringMvc 的控制器可以是单例模式,但这将导致线程安全问题,可以通过避免使用同步和字段来解决。 2. SpringMvc 中控制器的注解? @Controller 注解表明该类扮演控制器的角色。 3. @RequestMapping 注解用在类上...
线程安全问题通常涉及到并发环境下多个线程对共享数据的访问,实现线程安全可以通过同步机制(如synchronized关键字,Lock等)、线程局部变量(ThreadLocal)、不可变对象等方式来保证。 Java中的volatile和...
13. **Struts2的核心过滤器Dispatcher**:Struts2的Dispatcher是基于线程局部变量ThreadLocal实现的,保证每个请求都有自己独立的Dispatcher实例,实现线程安全。 14. **SpringMVC和Struts2的安全性**:SpringMVC在...
例如,在 Apache 或 Nginx 的配置文件中,或者在你的后端框架(如 SSM,即 Spring、SpringMVC、MyBatis 的组合)中添加适当的响应头,如 "Access-Control-Allow-Origin",允许指定或通配符(*)的源访问。...
标题中的“一个基于Java、Spring、SpringMVC、Mybatis、MySQL的伙伴云表格系统”表明这是一个使用现代Java技术栈开发的云端数据管理应用。这个系统利用了Java的强大功能,结合了Spring框架的多个组件,包括Spring...
线程安全问题主要涉及并发环境下多个线程访问共享数据时的正确性。实现线程安全可以通过同步机制,如`synchronized`关键字、`volatile`变量和`ThreadLocal`。`volatile`确保变量在多线程环境下的可见性,但不保证...
10. **线程安全**:Java中,可以使用`synchronized`关键字、`volatile`变量、`ThreadLocal`、`Lock`等机制保证线程安全。 11. **Spring的IOC与AOP**:IOC(Inversion of Control)控制反转,让Spring容器管理对象的...
Java软件工程师面试中,涉及到的知识点广泛且深入,涵盖了编程基础、框架理解、并发与线程安全、数据库操作以及前端技术等多个方面。以下是对这些知识点的详细解释: 1. **SpringMVC的理解**:SpringMVC是Spring...
13. **线程安全**:Java中,可以通过`synchronized`关键字、`volatile`变量、`Lock`接口等机制保证线程安全。 14. **Spring的IOC与AOP**:IOC(Inversion of Control,控制反转)是Spring的核心,通过容器管理对象...
为了保证线程安全,可以使用synchronized关键字,或者使用并发包下的并发工具类,如Volatile变量、Atomic系列类。 12. **Spring的IOC与AOP** - IOC(Inversion of Control)控制反转,将对象的创建和管理交给...
SqlSession则代表了与数据库的一次会话,它是线程非安全的,每个数据库操作应该在自己的SqlSession中进行,用完即关闭,避免在多个线程间共享。 在MyBatis中,处理复杂的查询时,可以使用嵌套结果映射来处理重复的...
而 `StringBuffer` 是线程安全的,适用于多线程环境。 - 当需要频繁修改字符串时,应优先考虑使用 `StringBuilder` 或 `StringBuffer`。 - **示例分析**: - `String a = "str"; String b = new String("str");` ...