Volatile HashMap vs ConcurrentHashMap
2022-09-02 02:41:21
我有一个缓存类,其中包含一个用于存储缓存项的缓存项。volatile HashMap<T>
我很好奇改成会有什么后果?volatile HashMap
ConcurrentHashMap
我会获得性能提升吗?此缓存是只读缓存。
使用的最佳选择是什么?只是哈希地图?缓存正在按时间间隔填充。
我有一个缓存类,其中包含一个用于存储缓存项的缓存项。volatile HashMap<T>
我很好奇改成会有什么后果?volatile HashMap
ConcurrentHashMap
我会获得性能提升吗?此缓存是只读缓存。
使用的最佳选择是什么?只是哈希地图?缓存正在按时间间隔填充。
首先,您似乎不了解关键字的作用。它确保如果声明的变量所保存的引用值发生更改,其他线程将看到它,而不是具有缓存的副本。它与线程安全无关,涉及访问volatile
volatile
HashMap
鉴于此,以及您说是只读的事实...您当然不需要使用任何提供线程安全性的东西,包括HashMap
ConcurrentHashMap
编辑以添加:您上次编辑的内容现在显示“缓存正在按时间间隔填充”
那不是只读的,不是吗?
如果你打算在编写(更新现有的HashMap)时有线程从中读取它,那么你应该使用,yes。ConcurrentHashMap
如果要填充一个全新的变量,然后将其分配给现有变量,则使用HashMap
volatile
你说缓存是只读的,但也在一个似乎矛盾的间隔内更新。
如果整个缓存在某个时间间隔内更新,我会继续使用易失性。易失性将确保安全发布更新的地图。
public final class Cache
{
private volatile Map<?,?> cache;
private void mapUpdate() {
Map<?,?> newCache = new HashMap<>();
// populate the map
// update the reference with an immutable collection
cache = Collections.unmodifiableMap(newCache);
}
}
如果间隔更新正在修改同一缓存,则您可能希望使用 ConcurrentHashMap,或复制映射、更新副本和更新引用。
public final class Cache
{
private volatile Map<?,?> cache;
private void mapUpdate() {
Map<?,?> newCache = new HashMap<>(cache);
// update the map
// update the reference with an immutable collection
cache = Collections.unmodifiableMap(newCache);
}
}