【问题标题】:What will happen if two different threads(say two different https requests) try to modify/update the same key at same time in the concurrent hashmap?如果两个不同的线程(比如两个不同的 https 请求)尝试在并发 hashmap 中同时修改/更新同一个键,会发生什么?
【发布时间】:2021-06-21 20:23:54
【问题描述】:

如果两个不同的线程(比如两个不同的 https 请求)尝试修改/更新并发 hashmap 中的相同键会发生什么?

Map mp = new ConcurrentHashMap(); 说,线程 t1 想添加键值对 mp.put("key", v1) & 线程 t2 也想通过两个不同的 http 同时添加相同的键但不同的值 mp.put("key", v2)请求那么在这种情况下会发生什么?它不会抛出任何异常吗?

【问题讨论】:

  • 先发生,仅此而已。
  • 我发现回答这些“如果...?”问题的好方法是编写一个单元测试,然后看看会发生什么。使用 java.util.concurrent.ExecutorsCompletableFuture 应该可以解决问题。
  • @jeremyt 这不是解决并发问题的好方法。 1) 很难构建预期的场景(“两个动作完全同时执行”) 2) 更难验证场景是否确实发生过(“他们真的完全同时执行”)3)观察到的行为可能是故意未指定的实现细节,如果不完全理解规范,您将无法理解。而另一方面,当您完全理解规范时,无论如何,这个问题在大多数情况下都是没有实际意义的,不需要进行测试。

标签: java collections


【解决方案1】:

并发hashmap会在添加/修改数据时锁定段。 当一个线程锁定一个段以进行更新时,它不允许任何其他线程在同一段中执行更新,直到该段上的锁定未被释放。

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多