并发只读HashMap

xgb*_*84j 4 java hashmap concurrenthashmap

我正在编写一个Web服务,它严重依赖于每小时完全更新一次的单个大型Map.剩下的时间里很多线程同时读取表.

我的问题是:实现这样一个地图最有效的结构是什么?

地图可以更大(100 - 500 MB).除了每小时更换一次整个地图之外,只有读取权限.

我正在考虑使用Java HashMap并且可能使用反射来在更新之间设置最终字段,如果这样可以提高性能,但我不知道如何使JVM针对许多并发读取进行优化.

Boh*_*ian 15

由于地图在使用时未更新,因此请使用a HashMap,它可提供出色的O(1)查找性能(牺牲线程安全性).

在刷新时,构建新地图并交换引用.

考虑使用a AtomicReference来使交换线程安全:

private final AtomicReference<Map<K, V>> mapRef = new AtomicReference<>();
Run Code Online (Sandbox Code Playgroud)

使用:

mapRef.get().get(key);
Run Code Online (Sandbox Code Playgroud)

要初始化或交换新地图:

Map<K, V> newMap = new HashMap<>();
// populate map
mapRef.set(newMap); // all threads will see this change
Run Code Online (Sandbox Code Playgroud)