2012-08-17 40 views
3

ConcurrentHashMap在1.5中作爲java java.util.concurrent包被引入。在此之前,製作threadsafe地圖的唯一方法是使用HashTableCollections.synchronizedMap(Map)Hashtable的ConcurrentHashMap的具體用法

對於所有的實際目的(多線程環境),ConcurrentHashMap是足以解決除了一種情況下的需要,其中一個線程需要一個統一視圖地圖的

我的問題是,除了有一個統一的地圖視圖,有沒有其他的場景,其中ConcurrentHashMap不是一個選項?

+0

您可能會發現某些情況下,其中一個或另一個的性能低於您的要求。也許當重負載。你需要測量這些東西。 – Bill 2012-08-17 14:34:35

+0

什麼是「統一視圖」?你能否解釋一下...... – yegor256 2012-08-17 14:41:58

+1

@ yegor256,統一視圖是地圖條目的一個視圖,當線程訪問這個特定的地圖時它不會改變。 – Santosh 2012-08-17 14:56:18

回答

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,我建議您也應該這樣做。

4

Hashtable的使用已經從Java 1.2氣餒和synchronizedMap效用相當有限,而且幾乎總是結束是不夠的,由於鎖定的太細的粒度。但是,如果確實有個別更新是您需要的顆粒尺寸的情況,則ConcurrentHashMapsynchronizedMap更不容易選擇。它具有更好的併發性,線程安全的迭代器(不,synchronizedMap不會有那些—這是由於它的設計作爲圍繞非線程安全映射的包裝),更好的整體性能和很少的額外內存重量爲此付出代價。