java - 在 Map 中,如果我们使用现有键进行修改,我们不会得到 ConcurrentModificationException

标签 java multithreading concurrency

我有以下代码,我希望在情况 2 场景中抛出 ConcurrentModificationException ,但它运行成功。据我所知,如果我在 map 中使用单键做同样的事情,它不会抛出异常,因为 here 但当我再次重现这个场景时,有多个键和两个案例 -

  1. 通过新 key 进行修改。
  2. 通过现有 key 进行修改。

案例1:

    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

案例2:

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

它不会抛出ConcurrentModificationException。为什么??

最佳答案

在第一种情况下,您修改映射的结构,以便获得 CME(添加新的键/值对)。在第二种情况下,您不会修改结构(覆盖现有键的值)。所以你不会得到 CME

关于java - 在 Map 中,如果我们使用现有键进行修改,我们不会得到 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30701789/

相关文章:

java - IntelliJ 插件 : Access is allowed from event dispatch thread only

java - Spring 数据休息: Null Pointer If-Modified-Since Header Present and Resource Not Auditable

java - Lucene 良好实践和线程安全

java - 64 位 OpenJDK 7/8 中并发长写入的值完整性保证

c++ - 解释这个 Concurrency::Task 调用中的 "="sign 参数

java - 指定 AWS Cloudwatch 日志客户端的凭证

java - SQL、Hibernate(注解): Unable to remove parent row from table

C# WinForms : Drawing with one or more additional threads. 怎么办?

java - ClassCastException NativeRegExpExecResult 无法转换为 NativeArray

java - 计算方法的并发调用