2011-04-11 38 views
4

我有一張地圖,我正在同步它。在同步之後插入地圖的行爲會有什麼不同嗎?HashMap同步

HashMap<String,String> myMap = new HashMap<String,String>(); 
myMap.put("abc","123"); 
myMap.put("efg","456"); 
Collections.synchronizedMap(myMap); 
myMap.put("hij","789"); 
myMap.put("jkl","234"); 

回答

4

調用Collections.synchronizedMap(myMap);之後的插入將是線程安全的,之前的插入不會是線程安全的。所有Collections.synchronizedMap(myMap);都會將您的地圖對象包裹在線程安全的SynchronizedMap對象中。除此之外,沒有區別。

此外,您還需要將代碼更改爲myMap = Collections.synchronizedMap(myMap);

0

沒有區別。

Collections.synchronizedMap()只是轉發HashMap

2

它的行爲與之前的地圖完全相同,除了它將被同步。您必須使用Collections.synchronizedMap(myMap);的返回值,因爲參數myMap不會被更改。

0
Collections.synchronizedMap(myMap); 

你忽略了返回值。 使用如

Map syncMap = Collections.synchronizedMap(myMap); // wrapper 
0

HashMap不同步的,因此插入元件從併發線程產生不確定的結果。使用同步映射可以防止這一點。

4
<K, V> Map<K, V> java.util.Collections.synchronizedMap(Map<K, V> m) 

返回由指定映射支持的同步(線程安全)映射。爲了保證串行訪問,通過返回的映射完成對備份映射的所有訪問是非常重要的。

當務之急是用戶迭代它的任何集合視圖時返回的地圖上手動同步:

Map m = Collections.synchronizedMap(new HashMap()); 
    ... 
Set s = m.keySet(); // Needn't be in synchronized block 
    ... 
synchronized(m) { // Synchronizing on m, not s! 
    Iterator i = s.iterator(); // Must be in synchronized block 
    while (i.hasNext()) 
     foo(i.next()); 
} 

不遵守此建議將導致無法確定的行爲。

如果指定的映射是可序列化的,則返回的映射將是可序列化的。

參數: 將地圖「包裹」在同步映射中。 返回: 指定映射的同步視圖。

0

方法Collections.synchronizedMap(Map)創建一個新的同步映射,由您在參數中傳遞的映射支持。因此它不會同步地圖myMap

1

你有沒有考慮使用從java.util.concurrent中的ConcurrentHashMap的?

基本上,這或多或少地代替了HashMap,但在正確使用時是線程安全的,爲特定任務提供了額外的保證原子方法,並且是無鎖的(通過利用一個合理的哈希函數)在大多數情況下。