ConcurrentHashMap中'thread-safe'的含义

时间:2012-06-13 13:17:44

标签: java

由于桶级锁定,CHM提供了性能提升,而不是Collections.synchronizedMap(...)/ hashtable。

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

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

2 个答案:

答案 0 :(得分:2)

线程安全意味着您可以跨多个线程共享ConcurrentHashMap对象,并且无需外部锁定即可同时访问/修改该对象。

documentation

中解释了确切的语义
  

检索操作(包括get)通常不会阻止,因此可能与更新操作重叠(包括putremove)。检索反映了最近完成的更新操作的结果。

     

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

答案 1 :(得分:1)

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

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

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