3

ConcurrentHashMap在 1.5 中作为 javajava.util.concurrent包的一部分引入。在此之前,拥有threadsafe地图的唯一方法是使用HashTableor Collections.synchronizedMap(Map)

对于所有实际目的(多线程环境),ConcurrentHashMap足以满足需要,除了线程需要映射的统一视图的一种情况。

我的问题是,除了拥有地图的统一视图之外,还有其他情况ConcurrentHashMap不是一种选择吗?

4

3 回答 3

4

Hashtable自 Java 1.2 以来一直不鼓励使用 ,并且 的实用性synchronizedMap非常有限,并且由于锁定的粒度太细,几乎总是最终不足。但是,当您确实遇到单个更新是您需要的粒度大小的情况时,这ConcurrentHashMap是一个比synchronizedMap. 它具有更好的并发性、线程安全的迭代器(不,synchronizedMap 没有这些——这是因为它的设计是围绕非线程安全映射的包装器)、更好的整体性能以及需要支付的额外内存重量很少这一切。

于 2012-08-17T14:56:48.477 回答
3

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

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

Hashtable t = new Hashtable();

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

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

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

于 2012-08-17T15:04:16.580 回答
1

据我了解,是ConcurrentMap替代线程安全的目的。不鼓励使用所有类。因此,您的问题的答案是“不,没有其他情况”。HashTableCollections.synchronizedMap()

另请参阅:ConcurrentHashMap 和 Collections.synchronizedMap(Map) 有什么区别?

于 2012-08-17T14:44:13.080 回答