ConcurrentHashMap 在 1.5 中作为 java java.util.concurrent 包的一部分引入。在此之前,获得 threadsafe 映射的唯一方法是使用 HashTableCollections.synchronizedMap(Map)

对于所有实际目的(多线程环境),ConcurrentHashMap 足以满足需求,除了一种情况,其中线程需要 map 的 统一 View 。

我的问题是,除了拥有 map 的统一 View 之外,是否还有其他场景 ConcurrentHashMap 不是一个选项?

最佳答案

这是一个延伸,但我会把它作为一个用例。

如果您需要一个线程安全的 Map 实现,您可以执行一些额外的复合操作,而 ConcurrentMap 则无法使用该操作。假设您要确保在添加第三个对象之前不存在另外两个对象。

Hashtable t = new Hashtable();

synchronized(t){
   if(!t.contains(object1) && !t.contains(object2)){
      t.put(object3,object3);
   }
}

同样,这是一个延伸,但您无法在确保原子性和线程安全性的同时使用 CHM 实现这一点。因为 Hashtable 及其 synchronizedMap 计数器部分的所有操作在 Map 的实例上同步,这确保了线程安全。

归根结底,我很少(如果有的话)使用 synchronizedMap/Hashtable,我建议您也应该这样做。

关于java - Hashtable over ConcurrentHashMap 的具体用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12007536/

10-12 22:56