Volatile HashMap vs ConcurrentHashMap

2022-09-02 02:41:21

我有一个缓存类,其中包含一个用于存储缓存项的缓存项。volatile HashMap<T>

我很好奇改成会有什么后果?volatile HashMapConcurrentHashMap

我会获得性能提升吗?此缓存是只读缓存。

使用的最佳选择是什么?只是哈希地图?缓存正在按时间间隔填充。


答案 1

首先,您似乎不了解关键字的作用。它确保如果声明的变量所保存的引用值发生更改,其他线程将看到它,而不是具有缓存的副本。它与线程安全无关,涉及访问volatilevolatileHashMap

鉴于此,以及您说是只读的事实...您当然不需要使用任何提供线程安全性的东西,包括HashMapConcurrentHashMap

编辑以添加:您上次编辑的内容现在显示“缓存正在按时间间隔填充”

那不是只读的,不是吗?

如果你打算在编写(更新现有的HashMap)有线程从中读取它,那么你应该使用,yes。ConcurrentHashMap

如果要填充一个全新的变量,然后将其分配给现有变量,则使用HashMapvolatile


答案 2

你说缓存是只读的,但也在一个似乎矛盾的间隔内更新。

如果整个缓存在某个时间间隔内更新,我会继续使用易失性。易失性将确保安全发布更新的地图。

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);
   }
}