HashMap同步

时间:2011-04-11 10:33:33

标签: java

我有一张地图,我正在同步它。同步后插图中的地图行为会有什么不同吗?

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");

8 个答案:

答案 0 :(得分: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());
}

不遵循此建议可能会导致非确定性行为。

如果指定的地图是可序列化的,则返回的地图将是可序列化的。

参数:     将地图“包装”在同步地图中。 返回:     指定地图的同步视图。

答案 1 :(得分:4)

调用Collections.synchronizedMap(myMap);后的插入将是线程安全的,之前的插入将不是线程安全的。所有Collections.synchronizedMap(myMap);都将您的地图对象包装在一个线程安全的SynchronizedMap对象中。除此之外没有区别。

此外,您需要将代码更改为myMap = Collections.synchronizedMap(myMap);

答案 2 :(得分:2)

它的行为与之前的地图完全相同,只是它会被同步。您必须使用Collections.synchronizedMap(myMap);的返回值,因为参数myMap不会被更改。

答案 3 :(得分:1)

您是否考虑过使用java.util.concurrent中的ConcurrentHashMap?

基本上,这或多或少是对HashMap的替换,但在正确使用时是线程安全的,对某些任务有额外的保证原子方法并且是无锁的(通过利用a的属性)合理的散列函数)在大多数情况下。

答案 4 :(得分:0)

没有区别。

Collections.synchronizedMap()只需转发 HashMap

答案 5 :(得分:0)

Collections.synchronizedMap(myMap);

您忽略了返回值。    用作

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

答案 6 :(得分:0)

是的,HashMap未同步,因此从并发线程插入元素会产生未定义的结果。使用同步映射可以防止这种情况。

答案 7 :(得分:0)

方法Collections.synchronizedMap(Map)创建一个新的同步映射,由您在参数中传递的映射支持。因此,它不会同步地图myMap