Java 并行写入Ehcache是否存在危险?

Java 并行写入Ehcache是否存在危险?,java,parallel-processing,ehcache,Java,Parallel Processing,Ehcache,在给定的示例中,我有一个内部类,它在一个想象的ExampleCache类中定义了一个read-throughCacheLoaderWriter,该类将抽象缓存操作,以便第三方认为他们正在访问数据结构(键值对)。我的问题涉及loadAll方法 如果将loadAll写为并行写入EhCache,是否存在记录突变或不稳定的风险?EhCache是为处理用户定义的并发而构建的吗 class ExampleCacheLoader implements CacheLoaderWriter<Stri

在给定的示例中,我有一个内部类,它在一个想象的
ExampleCache
类中定义了一个read-through
CacheLoaderWriter
,该类将抽象缓存操作,以便第三方认为他们正在访问数据结构(键值对)。我的问题涉及
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;
            }
            .

            .

            .
类示例CacheLoader实现CacheLoaderWriter{
私有哈希映射;
公共缓存加载程序(){
map=新的HashMap();
}
@凌驾
公共ArrayList加载(字符串s)引发异常{
Map.Entry personEntry=getPersonalias;
如果(!map.containsKey(personEntry.getKey())){
put(personEntry.getKey(),personEntry.getValue());
}
返回map.get(personEntry.getKey());
}
@凌驾
公共地图加载全部(

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

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


但是,您的
CacheLoaderWriter
实现必须是线程安全的,因为Ehcache将同时使用它。此外,在您建议的实现中,您正在维护
CacheLoaderWriter
中的状态,这与
缓存
的功能是多余的……如果我正确理解您试图实现的功能的话

这完全是有道理的。我在java中缓存比较新,我以前的经验只有C和C++,所以我想我只会有一些误解,我很幸运。