如何设计一个本地缓存( 九 )


@Override
public V call() throws Exception {
return c.compute(arg);

;
FutureTask<V> ft = new FutureTask<V>(eval);
f = cache.putIfAbsent(arg ft);
if (f == null) {
f = ft;
ft.run();

try {
return f.get();
catch (CancellationException e) {
cache.remove(arg f);




compute是一个计算很费时的方法 , 所以这里把计算的结果缓存起来 , 但是有个问题就是如果两个线程同时进入此方法中怎么保证只计算一次 , 这里最核心的地方在于使用了ConcurrentHashMap的putIfAbsent方法 , 同时只会写入一个FutureTask;

总结

本文大致介绍了要设计一个本地缓存都需要考虑哪些点:数据结构 , 对象上限 , 清除策略 , 过期时间 , 线程安全 , 阻塞机制 , 实用的接口 , 是否持久化;当然肯定有其他考虑点 , 欢迎补充 。

推荐阅读