package cn.hc.sort.thread.cache;
import java.util.concurrent.ExecutionException;
/**
* 高效缓存
* Created by yhc on 2015/5/7.
*/
public interface Computable<A,V> {
V compute(A arg) throws InterruptedException, ExecutionException;
}
package cn.hc.sort.thread.cache;
import java.util.concurrent.*;
/**
* 高效缓存实现
* Created by yhc on 2015/5/7.
*/
public class Memoizer<A,V> implements Computable<A,V> {
private final ConcurrentHashMap<A,Future<V>> cache=new ConcurrentHashMap<A, Future<V>>(2048);
private final Computable<A,V> computable;
public Memoizer(Computable<A, V> computable) {
this.computable = computable;
}
@Override
public V compute(final A arg) throws InterruptedException, ExecutionException {
Future<V> future=cache.get(arg);
if(future==null){
Callable<V> eval=new Callable<V>() {
@Override
public V call() throws Exception {
return computable.compute(arg);
}
};
FutureTask<V> ft=new FutureTask<V>(eval);
future=cache.putIfAbsent(arg,ft);
if(future==null){
future=ft;
ft.run();
}
}
return future.get();
}
}