并行写入Ehcache是否有危险



在给定的示例中,我有一个内部类,它在想象中的ExampleCache类内部定义了读取的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;
            }
            .
            .
            .

ehcache是一个用于并发访问的库,因此以最佳方式处理多线程,并发突变和相关问题。

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

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

最新更新