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