【问题标题】:java nested Map data structure read and write operationsjava嵌套Map数据结构读写操作
【发布时间】:2014-01-27 11:42:50
【问题描述】:

我有一个数据结构:-

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

这个数据结构的读操作频率会太高,写操作也会有,但不多。

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

对于写操作有两种方法:-

  1. 将整个数据放入ConcurrentHashMap,并用它来写入数据。

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

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

【问题讨论】:

标签: java multithreading hashmap


【解决方案1】:

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

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

并且完美解决。

其次,由于您正在使用映射结构的映射并在性能很重要的环境中使用,我会假设外部映射中的键数

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

  1. 它会生成很多临时对象。因此,如果您的应用程序对 GC 敏感,您需要限制其使用。
  2. 默认情况下它允许最多 16 个并发线程运行它 - 但这不太可能成为问题。
  3. 它的 size() 不是常数时间。

我通常会应用读写锁模式甚至基于原子变量的实现,主要是在 1. 被证明是一个问题时。否则我认为 ConcurrentHashMap 在大多数情况下都很好。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 2018-03-16
      相关资源
      最近更新 更多