今天在做系统优化查看生产环境日志的时候发现一个java.util.ConcurrentModificationException异常,在网上查看异常原因后,以为是这段代码的逻辑问题(在对ArrayList做迭代时对其进行了修改),后来找到对应的代码(在一个Action里)并没有发现导至这个异常对应的代码。
再仔细查看后发现被迭代的ArrayList对象属于类的成员属性,那么问题就找到了:当第一个用户访问这个Action方法正在对这个ArrayList做迭代时,另一个用户恰巧也访问的了这个Action对并对上个用户正在做迭代的对象做了修改(删除元素等),因为项目中Spring指定的Bean的模式是单例的,所以多次访问到的是同一个Bean实体对象,类的成员属性是“共享”的,就导至了上述的问题。
解决:先注掉对应的类的成员属性,有需要使用的地方重新new一个对象,之后本地测试没问题。
java.util.ConcurrentModificationException异常的详细说明:
http://www.cnblogs.com/dolphin0520/p/3933551.html
相关推荐
5. 在默认配置下,Struts2的Action是单例的,因此需要注意线程安全问题。如果Action中存在成员变量,需要确保它们是线程安全的,或者使用多例模式。 6. OGNL(Object-Graph Navigation Language)是强大的表达式...
- 如果使用Spring框架,可以通过将Action的scope设置为`prototype`,使每次请求都能创建一个新的Action实例。 - **Struts 2**: 线程安全。Struts 2中的Action为每个HTTP请求创建一个新实例,因此每个请求之间不会...
如果必须使用成员变量,则应该标记为`final`或使用线程安全的数据结构。 - **依赖注入**:利用Spring的依赖注入机制,将状态管理委托给线程安全的Bean。 - **使用ThreadLocal**:对于需要在不同请求间保持状态的场景...
- **singleton**:单例模式,容器中只有一个Bean实例。 - **prototype**:原型模式,每次请求都会创建一个新的Bean实例。 - **request**:每个HTTP请求都有一个Bean实例。 - **session**:每个HTTP Session都有一个...
- 如何定义和使用Result来处理Action的结果。 - **Intercepter框架** - Interceptor的工作原理及其在WebWork中的应用。 - **OGNL表达式语言** - OGNL(Object-Graph Navigation Language)的使用方法。 - **验证...
2. **Struts实现MVC**:Struts是一个基于MVC设计模式的Java Web框架,通过Action和Form Bean实现模型,JSP作为视图,控制器则由Struts控制器组件处理。 3. **字符串对象相等判断**:Java中,使用`equals()`方法判断...
- `action`:映射请求URL到具体的Action实例。 - `form-bean`:定义表单验证和数据封装的规则。 ### 17. 解释Request中的三个方法及其作用 - `getSession()`:获取当前请求的Session对象,用于保存用户状态信息。 ...