【问题标题】:Creating Synchronized static singleton Map in Java在 Java 中创建同步的静态单例 Map
【发布时间】:2012-12-06 04:16:32
【问题描述】:

我对创建同步静态对象有足够的了解。 但是对于 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

【问题讨论】:

  • singletonMap 用于单个元素,而不是地图的单个实例。
  • 您可能最好使用 ConcurrentMap(我假设您将修改地图?)
  • 是的。一旦线程完成它的工作,我将通过从地图中获取一些东西来修改地图

标签: java multithreading synchronization hashmap


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    public class MapHolder {
        public static final ConcurrentMap<String, Object> A_MAP = new ConcurrentHashMap<String, Object>();
    }
    

    【讨论】:

    • 既然是静态变量,那就是单例吧!但是final的意义是什么。 {我仍处于多线程学习阶段}
    • final 只是意味着其他人无法将新的并发映射分配给该变量。只能分配一次!
    【解决方案3】:

    出于性能原因,最好使用ConcurrentHashMapsynchronizedMap 会在地图实例上导致lock 并会降低性能。但是在ConcurrentHashMap 中,有高度优化的算法可实现高并发。

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

    ConcurrentHashMap 优于 synchronizedMap

    【讨论】:

      猜你喜欢
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多