为ConcurrentHashMap
采购javadoc,我阅读了以下声明,该声明使我烦恼于所述集合的线程安全性。
来自:Class ConcurrentHashMap
检索操作(包括get)通常不会阻塞,因此可能与更新操作(包括put
和remove
)重叠。检索反映了自发生以来最新完成的更新操作的结果。对于诸如putAll
和clear
之类的聚合操作,并发检索可能仅反映某些条目的插入或删除。
我发现这一段自相矛盾。确切地说,陈述2表示回退反映了最近完成的操作,而陈述3几乎表示对于汇总函数而言,这种行为无法得到保证。
这是否意味着像putAll
和clear
这样的合计操作仍然是冒险的选择?
最佳答案
这是否意味着像putAll和clear这样的合计操作仍然是冒险的选择?
他们的承诺是“检索行动...不会阻止”,这对他们所能承诺的目标施加了一些主要限制。例如,一个map.get(k)
调用必须立即返回null
或早先v
具有相同put(k,v)
的某些k
。 get(k)
调用不能等待其他线程完成map.putAll(someEnormousOtherMap)
调用。他们承诺不会阻塞!
基本上,他们不能遵守诺言,除非看起来唯一的操作是单个键/值对的插入/删除/替换。可以在不破坏non-blocking-get()承诺的情况下实现整合操作的唯一方法是将它们实现为一次操作一个键/值对的原子基元的非原子调用序列。