【发布时间】:2014-12-08 18:26:54
【问题描述】:
假设有两个线程 A、B 将分别在映射中放入两个不同的值 v1 和 v2,它们具有相同的键。密钥最初不存在于地图中 线程A调用containsKey,发现key不存在,立即挂起 线程B调用containsKey发现key不存在,有时间插入其值v2
当线程 A 回来时,会发生什么? 我假设,它调用 put 方法,该方法又调用 putIfAbsent 但是线程B已经插入了密钥,所以线程A不会覆盖该值
但是从这个链接我发现 线程 A 恢复并插入 v1,“和平地”覆盖(因为 put 是线程安全的)线程 B 插入的值 Is ConcurrentHashMap totally safe?
【问题讨论】:
-
answer by gd1 已经涵盖了这个。
-
只有(指定的)individual 方法是原子的(并且“完全安全”)。如果没有更大的构造,就不可能增加原子/互斥保证的范围。我相当肯定文档说明了这一点。
标签: java multithreading