0

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

我分别在 Java 中找到了默认实现(一个用于同步列表,一个用于单例映射)。

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 怎么样。

要求:静态同步单例映射将被大量线程用于某些处理操作

更新

看了几篇文章,发现ConcurrentMap在多线程环境下比HashMap好很多 http://java.dzone.com/articles/java-7-hashmap-vs

4

3 回答 3

3

Collections.singletonMap返回一个Map只有一个条目的不可变对象,而不是“您的应用程序中只存在一个”意义上的“单例”。(如果您使用Collections.singletonMap,则无需同步它,因为它是不可修改的。)

于 2012-12-06T16:37:24.693 回答
2

如果您使用的是 Java 6+,请使用 ConcurrentMap:

public class MapHolder {
    public static final ConcurrentMap<String, Object> A_MAP = new ConcurrentHashMap<String, Object>();
}
于 2012-12-06T04:24:39.857 回答
2

ConcurrentHashMap出于性能原因,最好使用它,synchronizedMap这将导致lock地图实例并降低性能。但是ConcurrentHashMap高度优化的算法来实现高水平的并发性。

例如,ConcurrentHashMap 对每个 Hash Bucket 都有锁,因此多个线程甚至可以更新映射。

ConcurrentHashMap好于synchronizedMap

于 2012-12-06T04:30:20.460 回答