gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:34:53 26 4
gpt4 key购买 nike

我的数据结构为:-

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

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

就读取而言,我想使用简单的 java.util.HashMap API 不会有任何问题。

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

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

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

请建议哪种写操作更好,并建议读操作是否存在漏洞。

最佳答案

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

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

完美解决。

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

ConcurrentHashMap 有 3 个主要的设计考虑因素:

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

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

另请注意,在 JDK 的最新实现中,ReadWriteLock 的读/写优先级发生了变化。如果我没记错的话,似乎更喜欢读操作而不是写操作;所以如果你有太多的读取,你的写入线程可能会出现线程饥饿。在这种情况下,您可能需要自己的读/写实现。

关于java嵌套Map数据结构读写操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21363869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com