在给定的示例中,我有一个内部类,该内部类在想象中的CacheLoaderWriter
类内部定义了一个通读ExampleCache
,该类将抽象缓存操作,以便第三方仅认为它们正在访问数据结构(键值对) 。我的问题涉及loadAll
方法。
如果写入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;
}
.
.
.
最佳答案
Ehcache是一个为并发访问而设计的库,因此可以以最佳方式处理多线程,并发突变和相关问题。
现在,您对CacheLoaderWriter
的理解似乎有问题。您不应从CacheLoaderWriter
访问高速缓存,而是在需要时由高速缓存访问CacheLoaderWriter
,也就是说,当请求映射但在高速缓存中找不到映射时,即为load*
方法访问。
但是,您的CacheLoaderWriter
实现必须是线程安全的,因为Ehcache会同时使用它。同样,在您建议的实现中,您要保持CacheLoaderWriter
内的状态,这与Cache
的工作是多余的...如果我正确理解了您要实现的目标。