并行写入 Ehcache 有危险吗?

Are There Dangers to Writing to Ehcache in Parallel?

在给定的示例中,我有一个内部 class,它在想象的 ExampleCache class 内部定义了一个通读 CacheLoaderWriter,它将抽象缓存操作,因此第 3 方只是认为他们正在访问数据结构(键值对)。我的问题涉及 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 将执行的操作是多余的......如果我理解正确你想要实现的目标。