使用FutureTask实现:
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
public class Cache {
private final ConcurrentHashMap<Long, Future<Long>> cache
= new ConcurrentHashMap<Long, Future<Long>>();
public Long getSquare(final Long arg) throws
InterruptedException{
for(;;){
Future<Long> f = cache.get(arg);
if(f == null){
System.out.println("null");
//请求参数没有命中缓存
//如果同一时间有多个针对该参数的请求到达
//则会创建多个针对同一个请求参数的FutureTask对象
FutureTask<Long> ft = new FutureTask<Long>(
new Callable<Long>(){
public Long call() throws Exception {
System.out.println("called");
long l = arg.longValue();
l = l *