2017-04-21 101 views
1

在给出的例子中,我有一个内部类,它在想象中的ExampleCache类中定义了一个读通CacheLoaderWriter,该类将抽象缓存操作,以便第三方仅仅认为他们正在访问数据结构(键值对)。我的问题涉及到loadAll方法。并行写入Ehcache会有危险吗?

如果写入loadAll并行写入EhCache,是否会有记录变异或不稳定的风险? EhCache是​​为处理用户定义的并发而构建的吗?

class ExampleCacheLoader implements CacheLoaderWriter<String, ArrayList> { 


      private HashMap<String, ArrayList> map; 

      public CacheLoader() { 
       map = new HashMap<>(); 
      } 

      @Override 
      public ArrayList<String> load(String s) throws Exception { 

       Map.Entry<String, ArrayList<String>> personEntry = getPersonAliases(s); 
       if(!map.containsKey(personEntry.getKey())){ 
        map.put(personEntry.getKey(), personEntry.getValue()); 
       } 
       return map.get(personEntry.getKey()); 
      } 

      @Override 
      public Map<String, ArrayList> loadAll(
        Iterable<? extends String> keys) throws Exception { 
       Map<String, ArrayList> localTempMap = new HashMap<>(); 
       Stream keyStream = StreamSupport.stream(entries.spliterator(), true); 
       keyStream.forEach(key -> { 
        localTempMap.putIfAbsent(
          getterExample(key).getKey(), 
          getterExample(key).getValue()); 
       }); 

       map.putAll(localTempMap); 
       return localTempMap; 
      } 
      . 

      . 

      . 

回答

1

Ehcache是​​一个为并发访问而设计的库,因此可以以最好的方式处理多线程,并发突变和相关问题。

现在你对CacheLoaderWriter的理解似乎有问题。您不应从CacheLoaderWriter访问高速缓存,而是在需要时由高速缓存访​​问CacheLoaderWriter,即在请求映射但在高速缓存中找不到时访问load*方法。

但是,您的CacheLoaderWriter实施必须是线程安全,因为Ehcache将同时使用它。同样在你提出的实现中,你正在维护CacheLoaderWriter内部的状态,这与Cache将做的事情是多余的......如果我正确地理解你想要实现的是什么。

+0

这是完全合理的。我对Java的缓存技术相对来说比较陌生,我以前的经历是用C和C++编写的,所以我想我只有几个误解才有幸运。 – Wes