【发布时间】:2011-01-30 08:05:05
【问题描述】:
早上好,希望能得到比我更了解 Java 的人的帮助。我来自 .NET 背景,负责追踪供应商提供的解决方案中的问题。我相信我已经找到了它,但如果可能的话,我想要第二、第三或第四意见。
我认为正在发生的是第 108 行(在下面的代码块中表示)正在修改在 while 循环外部声明的迭代器(memIter)。他们通过更改在循环内部声明的实例而不是原始对象来修改它,我相信它会抛出,因为在修改后的集合/hastbale 的第二次迭代中调用了“next”。我在这个网站上找到了许多指向这个的线程(http://stackoverflow.com/questions/602636/concurrentmodificationexception-and-a-hashmap)但是因为它修改了一个集合(对不起,如果这些是.net术语)在一个集合中(它从迭代器中项目的属性 hastable 中删除一个成员)我会假设相同的逻辑将适用,但它不是我的空间。另外,如果我的假设是正确的,有人可以提供正确的实现吗?
堆栈
java.util.ConcurrentModificationException 堆栈跟踪: java.util.ConcurrentModificationException 在 java.util.HashMap$HashIterator.nextEntry(HashMap.java:793) 在 java.util.HashMap$ValueIterator.next(HashMap.java:822) 在 xxx.xxxxx.xx.xxxxxxx.end(RoleOrganizer.java:108) 在 (xxxxxxxxx.java:568) 在 xxx.xxxx.xxxxxxx.handleRequest(xxxxHandler.java:74) 在 com.xxxxx.server.JavaInstanceMethod.execute(JavaInstanceMethod.java:33) 在 xx.xxxxxxx.execute(AppServer.java:1469) 在 xxx.xx.executeRequest(xxxxxjava:1269) 在 xxx.xxxxx.server.xxxx.doGet(xxxxx.java:350) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 在 org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190) 在 org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:283) 在 org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:767) 在 org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:697) 在 org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889) 在 org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690) 在 java.lang.Thread.run(Thread.java:619)
下面的代码显示堆栈错误行号 108
第 87 行 anpublic void end()
{
Iterator iter = new ArrayList(this.m_member.getRoles()).iterator();
while (iter.hasNext())
{
UserType rt = (UserType)iter.next();
if (!this.m_roleMap.containsKey(rt.getGID()))
{
this.m_member.removeRole(ut);
}
}
iter = this.m_roleMap.values().iterator();
第 99 行
while (iter.hasNext())
{
UserType ut = (UserType)iter.next();
if (ut.isUnique())
{
Iterator memIter = this.m_member.doTask().lookUpMembers().iterator();
while (memIter.hasNext())
{
第 108 行
StoreMember mem = (StoreMember)memIter.next();
if (mem.doWork() != this.m_member.getId())
{
if ((mem.hasRole(ut)) && (!mem.isFormer()))
{
mem.removeRole(ut);
}
}
}
}
【问题讨论】:
标签: java multithreading concurrency