构建高效可申缩的结果缓存

摘自<<JAVA并发编程实战>>

洋县ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!

public interface Computable<A, V> {
    V comput(A arg);
}

构建高效可申缩的结果缓存

import java.util.concurrent.*;/**
 * 构建高效可申缩的结果缓存
 * <p>
 * author: shiruiqiang
 * time: 31/01/2017 23:11
 **/public class Memoizer<A, V> implements Computable<A, V>{    private final ConcurrentHashMap<A, Future<V>> cache = new ConcurrentHashMap<A, Future<V>>();    private Computable<A, V> c;    public Memoizer(Computable c) {        this.c = c;
    }    public V comput(A arg) {        while(true) {
            Future<V> f = cache.get(arg);            if (f == null) { // 检查是缓存中是否已经存在,如果没有就创建
                Callable<V> task = new Callable<V>() {
                    @Override                    public V call() throws Exception {                        return c.comput(arg);
                    }
                };
                FutureTask<V> ft = new FutureTask(task);
                f = cache.putIfAbsent(arg, ft); // 原子操作,不会重复计算                if (f == null) { // 如果缓存中原来没有这个结果则执行任务计算结果
                    f = ft;
                    ft.run();
                }
            }            try {
                return f.get(); // 阻塞,等待结果.如果已经在缓存中则不会阻塞
            } catch(CancellationException e) {
                cache.remove(arg, f);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

构建高效可申缩的结果缓存

上述代码有多方面好处

1:计算与缓存隔离,解偶

2:线程安全

3:支持并发

4:并发时不会重复计算,高效

网站名称:构建高效可申缩的结果缓存
当前链接:https://www.cdcxhl.com/article4/iiesoe.html

成都网站建设公司_创新互联,为您提供网站内链ChatGPT自适应网站App开发定制开发网站设计

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都app开发公司