在同时向Ehcache写入时是否存在危险?

3
在此示例中,我有一个内部类,在想象的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;
            }
            .

            .

            .
1个回答

1
Ehcache是一个为并发访问而设计的库,因此以最佳方式处理多线程、并发变化和相关问题。
现在你对CacheLoaderWriter的理解似乎有问题。您不应该从CacheLoaderWriter访问缓存,而是在需要时缓存将访问CacheLoaderWriter,即在请求但未在缓存中找到映射时的load*方法。
然而,您的CacheLoaderWriter实现必须是线程安全的,因为Ehcache将同时使用它。此外,在您提出的实现中,您在CacheLoaderWriter内部维护状态,这与Cache将要做的重复...如果我正确理解您试图实现的内容。

这很有道理。我在Java缓存方面相对较新,之前唯一的经验是在C和C++中,所以我猜我只是幸运地遇到了一些误解。 - Wes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接