Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ConcurrentHashMap上哈希表的具体用法_Java_Concurrency_Hashtable_Concurrenthashmap - Fatal编程技术网

Java ConcurrentHashMap上哈希表的具体用法

Java ConcurrentHashMap上哈希表的具体用法,java,concurrency,hashtable,concurrenthashmap,Java,Concurrency,Hashtable,Concurrenthashmap,ConcurrentHashMap在1.5中作为javajava.util.concurrent包的一部分引入。在此之前,拥有threadsafe映射的唯一方法是使用HashTable或Collections.synchronizedMap(map) 对于所有实际用途(多线程环境),ConcurrentHashMap足以满足需要,但线程需要映射的统一视图的情况除外 我的问题是,除了有一个统一的地图视图外,还有没有其他情况下,ConcurrentHashMap不是一个选项 据我所知,Concurr

ConcurrentHashMap
在1.5中作为java
java.util.concurrent
包的一部分引入。在此之前,拥有
threadsafe
映射的唯一方法是使用
HashTable
Collections.synchronizedMap(map)

对于所有实际用途(多线程环境),
ConcurrentHashMap
足以满足需要,但线程需要映射的统一视图的情况除外


我的问题是,除了有一个统一的地图视图外,还有没有其他情况下,
ConcurrentHashMap
不是一个选项

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


另请参见:

自Java 1.2以来,Hashtable的使用一直不受欢迎,
synchronizedMap
的实用程序非常有限,并且由于锁定的粒度太细,几乎总是不够用。但是,当您确实有一个场景,其中单个更新是您需要的粒度时,
ConcurrentHashMap
是一个比
synchronizedMap
更明智的选择。它具有更好的并发性、线程安全迭代器(不,
synchronizedMap
没有这些迭代器,这是因为它的设计是围绕一个非线程安全映射的包装器)、更好的总体性能,并且几乎没有额外的内存重量来支付所有的开销。

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

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

Hashtable t = new Hashtable();

synchronized(t){
   if(!t.contains(object1) && !t.contains(object2)){
      t.put(object3,object3);
   }
}
同样,这是一个延伸,但您无法在确保原子性和线程安全的情况下使用CHM实现这一点。由于
哈希表
及其
synchronizedMap
计数器部分的所有操作都在映射实例上同步,因此确保了线程安全


在一天结束时,我很少(如果有的话)使用
synchronizedMap
/
Hashtable
,我建议您也这样做。

在某些情况下,您可能会发现其中一个性能不如您所需。也许是在负重的时候。你需要测量这些东西,什么是“统一视图”?请您解释一下…@yegor256,统一视图是指当线程访问此特定映射时,映射条目的视图不会更改。