千家信息网

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

发表于:2024-09-25 作者:千家信息网编辑
千家信息网最后更新 2024年09月25日,摘自<>public interface Computable { V comput(A arg);}import java.util.concurrent.*;/** * 构建高效可申缩的结果
千家信息网最后更新 2024年09月25日构建高效可申缩的结果缓存

摘自<>

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

import java.util.concurrent.*;/** * 构建高效可申缩的结果缓存 * 

* author: shiruiqiang * time: 31/01/2017 23:11 **/public class Memoizer implements Computable{ private final ConcurrentHashMap> cache = new ConcurrentHashMap>(); private Computable c; public Memoizer(Computable c) { this.c = c; } public V comput(A arg) { while(true) { Future f = cache.get(arg); if (f == null) { // 检查是缓存中是否已经存在,如果没有就创建 Callable task = new Callable() { @Override public V call() throws Exception { return c.comput(arg); } }; FutureTask 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:并发时不会重复计算,高效


0