在ConcurrentHashMap上具体使用Hashtable

时间:2012-08-17 14:17:31

标签: java concurrency hashtable concurrenthashmap

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

出于所有实际目的(多线程环境),ConcurrentHashMap足以满足需求,除了一个线程需要 统一视图 的情况。地图。

我的问题是,除了有地图的统一视图外,是否有其他情况ConcurrentHashMap不可选?

3 个答案:

答案 0 :(得分:4)

由于Java 1.2和Hashtable的实用程序非常有限,并且由于锁定的细粒度太小而几乎总是不够用,因此不鼓励使用synchronizedMap。但是,当您确实有个别更新是您需要的粒度时,ConcurrentHashMapsynchronizedMap更明智。它具有更好的并发性,线程安全的迭代器(不,synchronizedMap 具有这些 - 这是由于它的设计是非线程安全映射的包装器),更好整体性能,以及为此付出的额外内存重量。

答案 1 :(得分:3)

这是一个延伸,但我会将其作为一个用例。

如果您需要一个线程安全的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,我建议您也应该这样做。

答案 2 :(得分:1)

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

另请参阅:What's the difference between ConcurrentHashMap and Collections.synchronizedMap(Map)?