Hashtable相对ConcurrentHashMap的特定用法

3

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

就所有实际目的(多线程环境)而言,ConcurrentHashMap已足以满足需求,除了一个情况,即当一个线程需要获得map的统一视图时。

我的问题是,除了需要获得Map统一视图的情况外,是否还有其他场景不能使用ConcurrentHashMap


你可能会发现某些情况下,其中一个比另一个表现不佳,尤其是在负载较重的情况下。不过你需要测量这些事情。 - BillRobertson42
什么是“统一视图”?你能解释一下吗? - yegor256
1
@yegor256,统一视图是指当线程访问特定地图时不会更改地图条目的视图。 - Santosh
3个回答

4
Hashtable自Java 1.2起已经被弃用,synchronizedMap的实用性非常有限,几乎总是因锁定粒度太细而不足。然而,当您确实有需要单独更新的场景时,ConcurrentHashMapsynchronizedMap更好的选择是显而易见的。它具有更好的并发性、线程安全的迭代器(不,synchronizedMap没有这个功能——这是由于它是一个包装器,包装了一个非线程安全的map),整体性能更好,而且额外的内存开销也很小。

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,我建议你也应该避免使用。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接