52818 java.util.ConcurrentModificationException
52819 at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
52820 at java.util.HashMap$ValueIterator.next(HashMap.java:822)
52821 at org.directwebremoting.impl.DefaultScriptSessionManager.checkTimeouts(DefaultScriptSessionManager.java:179)
52822 at org.directwebremoting.impl.DefaultScriptSessionManager.maybeCheckTimeouts(DefaultScriptSessionManager.java:163)
52823 at org.directwebremoting.impl.DefaultScriptSessionManager.getScriptSession(DefaultScriptSessionManager.java:50)
52824 at org.directwebremoting.impl.DefaultWebContext.getScriptSession(DefaultWebContext.java:83)
52825 at org.directwebremoting.dwrp.BaseCallMarshaller.marshallOutbound(BaseCallMarshaller.java:305)
52826 at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:53)
52827 at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
52828 at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
52829 at com.netease.photo.webapp.web.servlets.PhotoDwrServlet.doPost(PhotoDwrServlet.java:51)
52830 at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
52831 at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
52832 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
52833 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
52834 at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265)
52835 at com.netease.photo.security.filter.NEAccessInfoFilter.doFilter(NEAccessInfoFilter.java:55)
52836 at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52837 at com.netease.photo.security.filter.NEFilterSecurityInterceptor.doFilter(NEFilterSecurityInterceptor.java:49)
52838 at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52839 at com.netease.photo.security.filter.NEAnonymousProcessingFilter.doFilter(NEAnonymousProcessingFilter.java:234)
52840 at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52841 at com.netease.photo.security.filter.NEAuthenticationProcessingFilter.doFilter(NEAuthenticationProcessingFilter.java:300)
52842 at org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275)
52843 at com.netease.photo.security.filter.NEExceptionTranslationFilter.doFilter(NEExceptionTranslationFilter.java:62)
问题代码,报出异常原因是sessionMap有变化,导致modCount和expectedModCount不相等,判断了checkForComodification()后,抛出异常
protected void checkTimeouts()
{
long now = System.currentTimeMillis();
List timeouts = new ArrayList();
synchronized (sessionLock)
{
for (Iterator it = sessionMap.values().iterator(); it.hasNext();)
{
DefaultScriptSession session = (DefaultScriptSession) it.next();
if (session.isInvalidated())
{
continue;
}
long age = now - session.getLastAccessedTime();
if (age > scriptSessionTimeout)
{
timeouts.add(session);
}
}
for (Iterator it = timeouts.iterator(); it.hasNext();)
{
DefaultScriptSession session = (DefaultScriptSession) it.next();
session.invalidate();
}
}
}
具有改变sessionMap的源码
public RealScriptSession getScriptSession(String id)
{
maybeCheckTimeouts();
synchronized (sessionLock)
{
DefaultScriptSession scriptSession = (DefaultScriptSession) sessionMap.get(id);
if (scriptSession == null)
{
scriptSession = new DefaultScriptSession(id, this);
* sessionMap.put(id, scriptSession);*
}
else
{
scriptSession.updateLastAccessedTime();
}
return scriptSession;
}
}
protected void invalidate(RealScriptSession scriptSession)
{
// Can we think of a reason why we need to sync both together?
// It feels like a deadlock risk to do so
synchronized (sessionLock)
{
*RealScriptSession removed = (RealScriptSession) sessionMap.remove(scriptSession.getId());*
if (!scriptSession.equals(removed))
{
log.debug("ScriptSession already removed from manager. scriptSession=" + scriptSession + " removed=" + removed);
}
int removeCount = 0;
for (Iterator it = pageSessionMap.values().iterator(); it.hasNext();)
{
Set pageSessions = (Set) it.next();
boolean isRemoved = pageSessions.remove(scriptSession);
if (isRemoved)
{
removeCount++;
}
}
if (removeCount != 1)
{
log.debug("DefaultScriptSessionManager.invalidate(): removeCount=" + removeCount + " when invalidating: " + scriptSession);
}
}
}
http://directwebremoting.org/jira/browse/DWR-536
这个是我们遇到的问题.
The problem is when using an iterator of a synchonized map; when using an iterator, the map (even when it is synchronized) should be synchronized while iterating...
即使对hashmap外部做了synchronized,在iterator的时候hashmap还是不安全的。(这里不安全的原因还在调查,估计跟jvm有关)
有两种解决方案
1.对hashmap在iterator之前做一次拷贝
2.对hashmap做同步,可以使用concurrenthashmap
在dwr后面的几次版本更新中已经有了修改
/* */ protected final ConcurrentMap sessionMap;
/* */ protected final ConcurrentMap> pageSessionMap;
/* 527 */ this.sessionMap = new ConcurrentHashMap();
/* */
/* 535 */ this.pageSessionMap = new ConcurrentHashMap();
http://pengtyao.iteye.com/blog/1074271
conCurrentHashMap再iterator的时候
http://stackoverflow.com/questions/3768554/is-iterating-concurrenthashmap-values-thread-safe
分享到:
相关推荐
- 性能优化:合理设置DWR的缓存策略和并发处理能力,提高响应速度。 - 错误处理:为异常情况提供良好的错误处理机制,确保用户友好体验。 8. **学习资源**: 博文链接提供的 `...
9. **性能优化**: 为了处理大量并发连接,可能需要考虑使用长轮询、WebSocket或其他现代推送技术,以提高效率和减少服务器负载。 通过以上知识点的集成和应用,我们可以构建一个实时的多人聊天系统,使用户能够在...
DWR提供了错误处理机制,可以通过日志或回调函数来捕获和处理这些异常。 9. **性能测试与优化**: 对于实时聊天系统,性能测试是必不可少的,包括测试连接建立速度、消息推送延迟以及在高并发情况下的稳定性。根据...
DWR (Direct Web Remoting) 是一种开源的Java技术,它允许Web应用程序在客户端和服务器...不过,需要注意的是,尽管DWR提供了强大的功能,但在高并发场景下可能需要结合其他技术,如WebSocket,以提高性能和可扩展性。
7. **性能优化**:根据需求调整DWR的配置,如缓存策略、并发控制等,以提高性能。 在实际开发中,DWR通常与Spring、Hibernate等其他框架结合使用,以构建更复杂的企业级应用。理解并熟练掌握DWR的这些特性,对于...
8. **Java多线程编程基础之线程和多线程.doc**:讲解了Java平台上的并发编程,包括线程创建、同步、死锁等问题,对于开发多用户、高并发应用必不可少。 9. **Java类的初始化过程.doc**:深入探讨了Java类的加载、...
6. **异常处理**:处理网络中断、浏览器关闭或其他异常情况,确保在出现问题时能够优雅地关闭连接并恢复。 7. **客户端集成**:在浏览器端编写JavaScript代码来处理接收到的推送消息,可能需要利用WebSocket API...
5. **异常处理**:设计良好的错误处理机制,如网络异常、支付失败等情况,确保系统的健壮性。 至于DWR(Direct Web Remoting),它是一种JavaScript和Java之间的远程调用技术,可以用来在前端和后端之间进行实时...
华为作为全球知名的科技公司,对Java程序员的面试通常会涵盖广泛的技术领域,包括基础语法、并发处理、面向对象设计、容器与框架、设计模式以及Web开发等多个方面。下面我们将详细探讨这些面试题所涉及的知识点。 1...
- 从DWR获取request对象:DWR(Direct Web Remoting)允许JavaScript调用服务器端方法。 - Struts2错误处理:异常处理器(ExceptionHandler)处理异常并展示错误页面。 - Hibernate优点:简单易用,支持ORM,缓存机制...
6. **异常处理**:Struts的异常处理机制可以帮助开发者优雅地管理程序中的错误和异常,书中会讨论如何配置和使用ActionError和ActionMessage。 7. ** strutstiles 插件**:Struts Tiles是一个强大的布局和页面组装...
熟悉异常处理、线程并发、集合框架(如ArrayList、LinkedList、HashMap等)、IO流和网络编程。 2. **JEE(Java Enterprise Edition)知识**:学习Servlet、JSP、JNDI、JMS、JTA等,了解如何在企业环境中构建分布式...
比如,服务器生成一个唯一的令牌,将其存储在session中,并发送给客户端。客户端在提交请求时携带该令牌,服务器检查令牌的有效性,确保请求的唯一性。 2. **Oracle分页语句**:Oracle中常用ROWNUM配合子查询进行...
- **健壮安全性**:Java具有严格的类型检查和异常处理机制,保障程序稳定性和安全性。 - **结构中立**:Java字节码可以在任何支持JVM的平台上运行,实现跨平台。 - **可移植性**:通过“一次编写,到处运行”原则...
这一部分涵盖了Java语言的基础特性、面向对象编程、异常处理、集合框架等基础知识,为后续的学习打下坚实的基础。 2. **Java多线程与并发库高级应用** - 多线程和并发是现代软件开发中不可或缺的一部分。这部分...
- **事务与并发、悲观锁、乐观锁**:事务管理和并发控制机制。 - **openSessionInView**:一种实现读取操作时的懒加载技术。 - **CurrentSession**:获取当前线程中的Session实例。 #### 十四、Spring - **Spring**...