易失性HashMap与ConcurrentHashMap

Dar*_*der 15 java concurrency caching hashmap

我有一个缓存类,其中包含一个volatile HashMap<T>存储缓存项.

我很好奇,这将是改变的后果volatile HashMapConcurrentHashMap

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

什么是最好的选择?只是HashMap?缓存正在一段时间内填充.

Bri*_*ach 34

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

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

编辑添加:您现在的最后一次编辑说"缓存正在间隔填充"

那不是只读的,不是吗?

如果你在写作想要从中读取线程(更新现有的HashMap),那么你应该使用a ConcurrentHashMap,yes.

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


Mic*_*sel 6

你说缓存是只读的,但也会在一个似乎相互矛盾的时间间隔内更新.

如果整个缓存在一个时间间隔内更新,我将继续使用volatile.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);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果间隔更新正在修改相同的缓存,那么您可能希望使用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);
   }
}
Run Code Online (Sandbox Code Playgroud)