【发布时间】:2020-01-05 16:08:30
【问题描述】:
为ConcurrentHashMap 采购javadoc,我阅读了以下关于所述集合的线程安全性的声明。
检索操作(包括get)一般不会阻塞,因此可能与更新操作重叠(包括
put和remove)。检索反映了最近完成的更新操作在其开始时保持的结果。对于putAll和clear等聚合操作,并发检索可能仅反映插入或删除某些条目。
我觉得这一段自相矛盾。准确地说,语句 2 表示检索反映了最近完成的操作,而语句 3 几乎说聚合函数不能保证这种行为。
这是否意味着像 putAll 和 clear 这样的聚合操作仍然是一个冒险的赌注?
【问题讨论】:
-
ConcurrentHashMap是(大部分)非阻塞集合类型之一。在更新其内容时,它通过保持几个不同的锁来锁定地图的一部分。这并不能保证特定方法后的同步。它保证您不会覆盖数据或损坏您的收藏。如果您需要一个始终为您提供其数据的最新视图的集合,请切换到Collections.synchronizedMap,它将每个操作锁定在同步块中。这还有其他含义,例如当大量线程更新或查询地图时的锁争用
标签: java synchronized java.util.concurrent concurrenthashmap