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)
| 归档时间: |
|
| 查看次数: |
5576 次 |
| 最近记录: |