1

我有一个HashMap存储 ID 和名称对。对于这张地图的每个条目,有条件地,我将把它放在另一个HashMap. 最后,我将对第二个地图条目进行一些操作。所有这些代码都写在 JSP 文件中。

对于单用户请求,这工作正常。当多个用户一次尝试访问此文件时,只有一个请求成功并且对其他用户产生相同的结果。

我们可以在日志中看到以下异常:

org.apache.jasper.JasperException: java.util.ConcurrentModificationException

地图是这种格式

Map<String, String> testmap= new HashMap<String, String>();
4

4 回答 4

2

来自java.util.HashMap的java文档:

所有此类的“集合视图方法”返回的迭代器都是快速失败的:如果在创建迭代器后的任何时间对映射进行结构修改,除了通过迭代器自己的 remove 方法之外,迭代器将抛出 ConcurrentModificationException . 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。

正如已经建议的那样,对您来说最简单的解决方案是同步对Map同时迭代/修改的访问。

Map map = ... //the map object has to be the same for all users calling your jsp

synchronized(map) {
   //do work
}

另请参阅 有关并发的 oracle java 教程

于 2012-09-23T17:46:38.603 回答
1

如果您的地图将被多个线程同时访问和修改,请尝试使用更好的地图实现来解决您的问题:ConcurrentHashMap 集合可以为您解决问题。

final Map<String,String> map = new ConcurrentHashMap<String,String>();

如果您不能使用 Java 5:

final Map map = Collections.synchronizedMap(new HashMap());
于 2012-09-25T15:20:03.947 回答
0

那么不同的请求可能在不同的线程上运行。您必须在通用数据结构测试图上进行同步。

有几种方法可以实现这一点。@Tudor 建议使用锁。那将是一种可能的方式。如果这是一个练习,我建议阅读有关多线程中的一般同步和synchronizedJava 中的方法的内容。

于 2012-09-23T17:45:38.470 回答
0

如果在迭代集合时修改集合,无论是从同一个线程还是同时从多个线程发生,都会收到该错误。我怀疑这是第二种情况,因为它发生在多个用户请求中。确保使用锁保护访问(可能每个地图对象一个锁)。

于 2012-09-23T17:46:03.673 回答