java嵌套Map数据结构的读写操作

时间:2014-01-26 13:17:37

标签: java multithreading hashmap

我有一个数据结构: -

Map<String,Map<String,List<CustomPOJO>>> 

此数据结构的读取操作频率过高,写入操作也会存在,但不会很多。

就阅读而言,我认为使用简单的java.util.HashMap API没有问题。

对于写入操作,可以有两种方法: -

  1. 将整个数据放入ConcurrentHashMap并使用它将数据写入其中。

  2. 以同步块/方法执行所有写入操作,并使用简单的java.util.HashMap API。

  3. 请建议哪一个更适合写操作,并建议读操作是否有任何漏洞。

2 个答案:

答案 0 :(得分:1)

首先,外部Map的键字符串值的可预测性如何?如果这在设计时都是可预测的,我宁愿把它变成Enum并使用EnumMap来保存外部Map。这同样适用于内部地图。在那种情况下,你的问题变成了

EnumMap<Enum, EnumMap<Enum, List<POJO>>>

并且完全解决了。

其次,既然你正在使用地图结构的地图并在性能很重要的环境中使用,我会假设外部地图中的键数&lt;&lt;整个结构内的POJO总数。也就是说,向整个结构添加新子图的可能性非常小。在这种情况下,ReadWriteLock最好在外部Map上;对于内部映射,您可以考虑使用ReadWriteLock或ConcurrentHashMap。

ConcurrentHashMap有三个主要的设计注意事项:

  1. 它会生成很多临时对象。因此,如果您的应用程序对GC敏感,则希望限制其使用。
  2. 它默认允许最多16个并发线程运行它 - 但这不太可能是一个问题。
  3. 它的大小()不是恒定的时间。
  4. 我经常应用ReadWrite锁模式甚至基于原子变量的实现,主要是1.当证明是一个问题。否则我认为ConcurrentHashMap在大多数情况下都可以。

    另请注意,在最新的JDK实现中,ReadWriteLock的读/写优先级已更改。如果我的记忆是正确的,它似乎更喜欢读操作而不是写;因此,如果你有太多的读取,你的写线程可能会线程饥饿。在这种情况下,您可能需要自己的读/写实现。

答案 1 :(得分:0)

我认为这篇文章最适合您的问题解释。我个人认为你应该使用ConcurrentHashMap,因为它允许读者在不阻塞所有hashmap的情况下阅读。 http://javarevisited.blogspot.com/2011/04/difference-between-concurrenthashmap.html