Java 并发HashMap线程安全和发生在关系之前
为Java 并发HashMap线程安全和发生在关系之前,java,synchronized,java.util.concurrent,concurrenthashmap,Java,Synchronized,Java.util.concurrent,Concurrenthashmap,为ConcurrentHashMap采购javadoc,我阅读了下面关于所述集合的线程安全性的声明 发件人: 检索操作(包括get)通常不会阻塞,因此可能与更新操作重叠(包括put和remove)。检索反映了最近完成的更新操作在开始时的结果。对于聚合操作,如putAll和clear,并发检索可能只反映插入或删除某些条目 我觉得这一段自相矛盾。确切地说,语句2表示retreivals反映了最近完成的操作,而语句3几乎表示聚合函数不能保证这种行为 这是否意味着像putAll和clear这样的聚合操作
ConcurrentHashMap
采购javadoc,我阅读了下面关于所述集合的线程安全性的声明
发件人:
检索操作(包括get)通常不会阻塞,因此可能与更新操作重叠(包括put
和remove
)。检索反映了最近完成的更新操作在开始时的结果。对于聚合操作,如putAll
和clear
,并发检索可能只反映插入或删除某些条目
我觉得这一段自相矛盾。确切地说,语句2表示retreivals反映了最近完成的操作,而语句3几乎表示聚合函数不能保证这种行为
这是否意味着像putAll
和clear
这样的聚合操作仍然是一种风险赌注
这是否意味着像putAll和clear这样的聚合操作仍然是一种风险赌注
他们承诺“检索操作…不要阻止”对他们可以承诺的其他内容设置了一些主要限制。例如,一个map.get(k)
调用必须立即返回null
或先前put(k,v)
具有相同k
的一些v
。get(k)
调用不能等待其他线程完成map.putAll(somenormousothermap)
调用。他们保证它不会阻塞
基本上,他们无法兑现这一承诺,除非看起来是原子操作的唯一操作是单个键/值对的插入/删除/替换。在不违背non-blocking-get()承诺的情况下实现加积门操作的唯一方法是将它们实现为一次对一个键/值对进行操作的原子原语的非原子调用序列。
ConcurrentHashMap
是(大部分)非阻塞收集类型之一。在更新地图内容时,它只锁定地图的一部分,方法是保留几个不同的锁。这并不能保证特定方法之后的同步。它保证您不会覆盖数据或损坏集合。如果您需要始终向您提供其数据最新视图的集合,请切换到Collections.synchronizedMap
,它将锁定同步块中的每个操作。这还有其他含义,例如当大量线程更新或查询映射时发生锁争用