我正在编写一个网络服务,它严重依赖于每小时完全更新一次的单个大型 map 。其余时间许多线程并发读取该表。
我的问题是:实现这样一个 Map 最有效的结构是什么?
map 可以相当大 (100 - 500 MB)。除了每小时更换一次整个 map 外,只有读取权限。
我正在考虑只使用 Java HashMap,如果这可以提高性能,也许可以使用反射将字段设置为 final,但我不知道如何让 JVM 为许多并发读取进行优化。
最佳答案
由于 map 在使用时不会更新,因此请使用 HashMap
,它提供出色的 O(1) 查找性能(以牺牲线程安全为代价)。
当需要刷新时,构建一个新 map 并交换引用。
考虑使用 AtomicReference
使交换线程安全:
private final AtomicReference<Map<K, V>> mapRef = new AtomicReference<>();
使用:
mapRef.get().get(key);
初始化或交换新 map :
Map<K, V> newMap = new HashMap<>();
// populate map
mapRef.set(newMap); // all threads will see this change
关于java - 并发只读HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21616234/