3

由于存储桶级别锁定,CHM 在使用而不是 Collections.synchronizedMap(...)/hashtable 时提供性能提升是可以的。

当我们不希望我们的迭代器抛出 ConcurrentModificationException 时,我们也可以使用 CHM。

但是我thread-safe对 CHM 上下文中的含义感到困惑,因为它们不会阻止更改在检索和写入重叠之间得到反映?

4

2 回答 2

2

线程安全意味着您可以ConcurrentHashMap在多个线程之间共享一个对象,并在没有外部锁定的情况下同时访问/修改该对象。

文档中解释了确切的语义:

检索操作(包括get)一般不会阻塞,因此可能与更新操作(包括putand remove)重叠。检索反映了最近完成的更新操作在其开始时保持的结果。

putAll对于和等聚合操作clear,并发检索可能仅反映插入或删除某些条目。同样,在迭代器/枚举创建时或之后的某个时间点,返回反映哈希表状态的元素IteratorsEnumerations他们不扔ConcurrentModificationException。但是,迭代器被设计为一次只能由一个线程使用。

于 2012-06-13T13:19:54.057 回答
1

正如 Aix 提到的,ConcurrentHashMap在没有外部锁的情况下跨多个线程共享对象是Thread-Safe

它的工作原理就像 ConcurrentHashMap(Sun 的当前实现)通过将底层映射划分为多个单独的桶来工作。获取元素本身不需要任何锁定,但它确实使用原子/易失性操作,这意味着内存屏障(可能非常昂贵,并且会干扰其他可能的优化)但Collections.synchronizedMap(...)锁定应用于整个地图,因此成本很高。

用法: ConcurrentHashMap is implemented for higher throughput in cases where high concurrency is expected

于 2012-06-13T13:28:44.817 回答