Dar*_*der 15 java concurrency caching hashmap
我有一个缓存类,其中包含一个volatile HashMap<T>存储缓存项.
我很好奇,这将是改变的后果volatile HashMap来ConcurrentHashMap?
我会获得性能提升吗?此缓存是只读缓存.
什么是最好的选择?只是HashMap?缓存正在一段时间内填充.
Bri*_*ach 34
首先,您似乎无法理解volatile关键字的作用.它确保如果声明的变量保持的引用值volatile发生更改,其他线程将看到它而不是具有缓存副本.它与访问线程安全无关HashMap
鉴于此,以及你说这HashMap是只读的事实......你当然不需要使用提供线程安全的任何东西,包括ConcurrentHashMap 
编辑添加:您现在的最后一次编辑说"缓存正在间隔填充"
那不是只读的,不是吗?
如果你在写作时想要从中读取线程(更新现有的HashMap),那么你应该使用a ConcurrentHashMap,yes.
如果要填充全新的,HashMap然后将其分配给现有变量,则使用volatile
你说缓存是只读的,但也会在一个似乎相互矛盾的时间间隔内更新.
如果整个缓存在一个时间间隔内更新,我将继续使用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);
   }
}
如果间隔更新正在修改相同的缓存,那么您可能希望使用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);
   }
}
| 归档时间: | 
 | 
| 查看次数: | 14102 次 | 
| 最近记录: |