在Java中创建同步静态单例映射

时间:2012-12-06 04:16:32

标签: java multithreading synchronization hashmap

我对创建同步静态对象有足够的了解。 但是对于Java中的Map(Collection),

我在Java中单独找到了默认实现(一个用于Synchronized列表,一个用于Singleton map)。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html#synchronizedMap(java.util.Maphttp://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

3 个答案:

答案 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>();
}