我对创建同步静态对象有足够的了解。 但是对于Java中的Map(Collection),
我在Java中单独找到了默认实现(一个用于Synchronized列表,一个用于Singleton map)。
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedMap(java.util.Map) http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#singletonMap(K,V)
我正在考虑通过以下实施获得所需的结果
Map<K,V> initMap = new HashMap<K,V>();
Map<K,V> syncSingMap = Collections.synchronizedMap(Collection.singletonMap(initMap));
我做得对吗?因为oracle上的文档显示了一些警告
It is imperative that the user manually synchronize on the returned map when iterating over any of its collection views:
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());
}
Failure to follow this advice may result in non-deterministic behavior
如何使用ConcurrentMap。
Requriement:静态同步单例映射,大量线程将用于某些处理操作
更新
经过一些文章后,发现ConcurrentMap比多线程环境中的HashMap要好得多 http://java.dzone.com/articles/java-7-hashmap-vs
答案 0 :(得分:2)
最好将ConcurrentHashMap
用于效果原因,synchronizedMap
会在地图实例上导致lock
并降低性能。但在ConcurrentHashMap
中,高度优化的算法可实现高水平的并发性。
例如,ConcurrentHashMap对每个Hash Bucket都有锁定,因此多个线程甚至可以更新地图。
ConcurrentHashMap
优于synchronizedMap
。
答案 1 :(得分:2)
Collections.singletonMap
返回一个只有一个条目的不可变Map
,而不是“应用程序中只存在一个”的“单例”。 (如果您使用Collections.singletonMap
,则无需同步它,因为它是不可修改的。)
答案 2 :(得分:1)
如果您使用的是Java 6 +,请使用ConcurrentMap:
public class MapHolder {
public static final ConcurrentMap<String, Object> A_MAP = new ConcurrentHashMap<String, Object>();
}