簡體   English   中英

在ConcurrentHashMap上具體使用Hashtable

[英]Specific usage of Hashtable over ConcurrentHashMap

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

出於所有實際目的(多線程環境), ConcurrentHashMap足以滿足需求,除了一個線程需要統一的地圖視圖的情況。

我的問題是,除了有一個統一的地圖視圖,還有其他任何情況,其中ConcurrentHashMap不是一個選項?

不鼓勵使用Hashtable因為Java 1.2和synchronizedMap的實用程序非常有限,並且由於過於精細的鎖定粒度,幾乎總是不夠用。 但是,當您確實有個別更新是您需要的粒度時, ConcurrentHashMapsynchronizedMap更好的選擇。 它具有更好的並發性,線程安全的迭代器(不, 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 ,我建議你也應該這樣做。

據我所知, ConcurrentMapHashTableCollections.synchronizedMap()的替代品,用於線程安全目的。 不鼓勵使用所有類。 因此,您的問題的答案是“不,沒有其他情況”。

另請參見: ConcurrentHashMap和Collections.synchronizedMap(Map)之間有什么區別?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM