java - 并发只读HashMap

标签 java hashmap concurrenthashmap

我正在编写一个网络服务,它严重依赖于每小时完全更新一次的单个大型 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/

相关文章:

使用 ConcurrentHashMap 进行 Kotlin 并发,同时在不使用锁的情况下检索和删除

java - 如何使用另一个类中的方法从一个 java 类中的 MD 数组中删除重复项

java - 使用 HashMap 比较两个字谜时出现编译错误

从 HashMap 中删除元素时出现 java.util.ConcurrentModificationException

Java:在创建 ConcurrentHashMap 对象时使用 synchronized(this) 是一种可取的做法吗?

java - 是否需要同步对线程安全函数的调用?

java - Oracle插入或更新或抛出异常

java - RecyclerView 中 MapView 的 IndexOutOfBoundsException

java - Lotus Notes 中的选项卡式表格

Java Streams Map,从键获取值 - List<Integer>(带过滤)