温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-07-12 14:57:37 来源:网络 阅读:275 作者:张涛泽 栏目:网络安全

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

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:并发时不会重复计算,高效


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI