java - 在Java中创建同步静态单例Map

标签 java multithreading synchronization hashmap

我对创建同步静态对象有足够的知识。 但是对于 Java 中的 map (集合),

我在 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 ,五)

我正在考虑通过以下实现来获得预期的结果

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

最佳答案

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

关于java - 在Java中创建同步静态单例Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13736873/

相关文章:

c++ - 如何使共享值在没有互斥锁的情况下保持一致?

asp.net - Asp.Net。同步访问(互斥)

c - 如何在两个进程之间进行简单的同步

visual-c++ - FinalConstruct()/FinalRelease() 内部是否需要同步?

java - spring-boot application.properties 中的环境变量错误

java - java中向ArrayList添加元素

java - JUnit5 : Trouble Importing Assertions

java - 声明 float ,为什么默认类型为 double?

c - 我使用代码块编写了一个单线程程序,但在任务管理器中它显示该程序正在使用 2 个线程?

java - Android:如何在非ui线程之间进行通信并处理调用者线程上的数据?