【发布时间】: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.Executors和CompletableFuture应该可以解决问题。 -
@jeremyt 这不是解决并发问题的好方法。 1) 很难构建预期的场景(“两个动作完全同时执行”) 2) 更难验证场景是否确实发生过(“他们真的完全同时执行”)3)观察到的行为可能是故意未指定的实现细节,如果不完全理解规范,您将无法理解。而另一方面,当您完全理解规范时,无论如何,这个问题在大多数情况下都是没有实际意义的,不需要进行测试。
标签: java collections