由于存储桶级别锁定,CHM 在使用而不是 Collections.synchronizedMap(...)/hashtable 时提供性能提升是可以的。
当我们不希望我们的迭代器抛出 ConcurrentModificationException 时,我们也可以使用 CHM。
但是我thread-safe
对 CHM 上下文中的含义感到困惑,因为它们不会阻止更改在检索和写入重叠之间得到反映?
由于存储桶级别锁定,CHM 在使用而不是 Collections.synchronizedMap(...)/hashtable 时提供性能提升是可以的。
当我们不希望我们的迭代器抛出 ConcurrentModificationException 时,我们也可以使用 CHM。
但是我thread-safe
对 CHM 上下文中的含义感到困惑,因为它们不会阻止更改在检索和写入重叠之间得到反映?
线程安全意味着您可以ConcurrentHashMap
在多个线程之间共享一个对象,并在没有外部锁定的情况下同时访问/修改该对象。
文档中解释了确切的语义:
检索操作(包括
get
)一般不会阻塞,因此可能与更新操作(包括put
andremove
)重叠。检索反映了最近完成的更新操作在其开始时保持的结果。
putAll
对于和等聚合操作clear
,并发检索可能仅反映插入或删除某些条目。同样,在迭代器/枚举创建时或之后的某个时间点,返回反映哈希表状态的元素Iterators
。Enumerations
他们不扔ConcurrentModificationException
。但是,迭代器被设计为一次只能由一个线程使用。
正如 Aix 提到的,ConcurrentHashMap
在没有外部锁的情况下跨多个线程共享对象是Thread-Safe
它的工作原理就像 ConcurrentHashMap(Sun 的当前实现)通过将底层映射划分为多个单独的桶来工作。获取元素本身不需要任何锁定,但它确实使用原子/易失性操作,这意味着内存屏障(可能非常昂贵,并且会干扰其他可能的优化)但Collections.synchronizedMap(...)
锁定应用于整个地图,因此成本很高。
用法:
ConcurrentHashMap is implemented for higher throughput in cases where high concurrency is expected