gpt4 book ai didi

Java 迭代器和嵌套哈希表的并发问题

转载 作者:行者123 更新时间:2023-11-30 05:06:48 25 4
gpt4 key购买 nike

早上好,希望能从比我更了解 Java 的人那里得到一些帮助。我有 .NET 背景,负责追踪供应商提供的解决方案中的问题。我相信我已经找到了它,但如果可能的话,希望获得第二个、第三个或第四个意见。

我认为正在发生的是第 108 行(如下面的代码块所示)正在修改在 while 循环外部声明的迭代器 (memIter)。他们通过更改在循环内部声明的实例而不是原始对象来修改它,我相信它会抛出,因为在修改后的集合/hastbale的第二次迭代中调用“next”。我在这个网站上发现了许多指向此的线程(http://stackoverflow.com/questions/602636/concurrentmodificationexception-and-a-hashmap),但因为它修改了一个集合(抱歉,如果这些是.net术语)在集合中(它从迭代器中项目的属性哈希表中删除成员)我会假设相同的逻辑将适用,但它不是我的空间。另外,如果我的假设是正确的,有人可以提供正确的实现吗?

堆栈

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.xxxxxxxx.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 行公共(public)无效结束()

{

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);
}
}
}
}

最佳答案

what i think is happening is that line number 108 (indicated in code block below) is modifying the Iterator

我怀疑您误解了在什么情况下会收到 ConcurrentModificationException

ConcurrentModificationException 不是由于迭代器的并发修改引起的,而是由于底层集合的并发修改引起的。

来自文档:

This exception may be thrown by methods that have detected concurrent modification of an object when such modification is not permissible.

For example, it is not generally permissible for one thread to modify a Collection while another thread is iterating over it.

关于Java 迭代器和嵌套哈希表的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4841849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com