我有一个数据结构: -
Map<String,Map<String,List<CustomPOJO>>>
此数据结构的读取操作频率过高,写入操作也会存在,但不会很多。
就阅读而言,我认为使用简单的java.util.HashMap
API没有问题。
对于写入操作,可以有两种方法: -
将整个数据放入ConcurrentHashMap
并使用它将数据写入其中。
以同步块/方法执行所有写入操作,并使用简单的java.util.HashMap
API。
请建议哪一个更适合写操作,并建议读操作是否有任何漏洞。
答案 0 :(得分:1)
首先,外部Map的键字符串值的可预测性如何?如果这在设计时都是可预测的,我宁愿把它变成Enum并使用EnumMap来保存外部Map。这同样适用于内部地图。在那种情况下,你的问题变成了
EnumMap<Enum, EnumMap<Enum, List<POJO>>>
并且完全解决了。
其次,既然你正在使用地图结构的地图并在性能很重要的环境中使用,我会假设外部地图中的键数&lt;&lt;整个结构内的POJO总数。也就是说,向整个结构添加新子图的可能性非常小。在这种情况下,ReadWriteLock最好在外部Map上;对于内部映射,您可以考虑使用ReadWriteLock或ConcurrentHashMap。
ConcurrentHashMap有三个主要的设计注意事项:
我经常应用ReadWrite锁模式甚至基于原子变量的实现,主要是1.当证明是一个问题。否则我认为ConcurrentHashMap在大多数情况下都可以。
另请注意,在最新的JDK实现中,ReadWriteLock的读/写优先级已更改。如果我的记忆是正确的,它似乎更喜欢读操作而不是写;因此,如果你有太多的读取,你的写线程可能会线程饥饿。在这种情况下,您可能需要自己的读/写实现。
答案 1 :(得分:0)
我认为这篇文章最适合您的问题解释。我个人认为你应该使用ConcurrentHashMap,因为它允许读者在不阻塞所有hashmap的情况下阅读。 http://javarevisited.blogspot.com/2011/04/difference-between-concurrenthashmap.html