[英]Specific usage of Hashtable over ConcurrentHashMap
ConcurrentHashMap
作為java java.util.concurrent
包的一部分在1.5中引入。 在此之前,擁有threadsafe
映射的唯一方法是使用HashTable
或Collections.synchronizedMap(Map)
。
出於所有實際目的(多線程環境), ConcurrentHashMap
足以滿足需求,除了一個線程需要統一的地圖視圖的情況。
我的問題是,除了有一個統一的地圖視圖,還有其他任何情況,其中ConcurrentHashMap
不是一個選項?
不鼓勵使用Hashtable
因為Java 1.2和synchronizedMap
的實用程序非常有限,並且由於過於精細的鎖定粒度,幾乎總是不夠用。 但是,當您確實有個別更新是您需要的粒度時, ConcurrentHashMap
比synchronizedMap
更好的選擇。 它具有更好的並發性,線程安全的迭代器(不, synchronizedMap
沒有那些 - 這是由於它的設計作為非線程安全映射的包裝器),更好的整體性能,以及非常少的額外內存權重支付為了這一切。
這是一個延伸,但我將它作為一個用例。
如果您需要一個線程安全的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
,我建議你也應該這樣做。
據我所知, ConcurrentMap
是HashTable
和Collections.synchronizedMap()
的替代品,用於線程安全目的。 不鼓勵使用所有類。 因此,您的問題的答案是“不,沒有其他情況”。
另請參見: ConcurrentHashMap和Collections.synchronizedMap(Map)之間有什么區別?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.