我有一张地图,我正在同步它。同步后插图中的地图行为会有什么不同吗?
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");
答案 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
。