Java 在Map中,如果我们使用现有键进行修改,则不会得到ConcurrentModificationException
我有以下代码,我希望从案例2场景中抛出Java 在Map中,如果我们使用现有键进行修改,则不会得到ConcurrentModificationException,java,multithreading,concurrency,Java,Multithreading,Concurrency,我有以下代码,我希望从案例2场景中抛出ConcurrentModificationException,但它运行成功。正如我所知道的,如果我对map中的单个键执行相同的操作,它不会抛出异常,因为 但是当我再次复制这个场景时,有两个案例的多个键- 通过新键进行修改 通过现有密钥进行修改 案例1: Map<String,String> mp = new HashMap<String,String>(); mp.put("1", "10"); mp.put
ConcurrentModificationException
,但它运行成功。正如我所知道的,如果我对map中的单个键执行相同的操作,它不会抛出异常,因为
但是当我再次复制这个场景时,有两个案例的多个键-
Map<String,String> mp = new HashMap<String,String>();
mp.put("1", "10");
mp.put("2", "11");
mp.put("3", "12");
mp.put("4", "13");
for (String key :mp.keySet()) {
mp.put("5", "14");
}
它不会抛出
ConcurrentModificationException
。为什么???在第一种情况下,您正在修改映射的结构,以便获得CME(添加新的键/值对)。在第二种情况下,您没有修改结构(覆盖现有键的值)。因此,当对CME进行迭代时其结构发生更改时,不会抛出CMEConcurrentModificationException,但在第二种情况下,结构没有更改。这意味着只需更新映射中的现有密钥(在第二种情况下既不添加也不删除,这将导致结构的更改)
参见您可以参考:
迭代器[…]是快速失效的:如果在迭代器创建后的任何时间,以任何方式(除迭代器自己的remove方法外)对映射进行结构修改,迭代器将抛出一个ConcurrentModificationException
结构修改的定义也可以在这里找到:
结构修改是添加或删除一个或多个映射的任何操作仅更改与实例已包含的键关联的值不是结构修改
最后,值得一读最后一段:
快速失败迭代器以最大努力抛出ConcurrentModificationException。因此,编写依赖于此异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测bug
Map<String,String> mp = new HashMap<String,String>();
mp.put("1", "10");
mp.put("2", "11");
mp.put("3", "12");
mp.put("4", "13");
for (String key :mp.keySet()) {
mp.put(key, "14");
}