摘自<<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:并发时不会重复计算,高效
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。