高并发缓存实现

private static ConcurrentHashMap<String, Future<Long>> glodDeptFutuMap = new ConcurrentHashMap<String, Future<Long>>();

Future 接口允许表示已经完成的任务、正在执行过程中的任务或者尚未开始执行的任务。

 

FutureTask 类实现了 Future,并包含一些构造函数,允许将 Runnable 或 Callable(会产生结果的 Runnable)和 Future 接口封装。因为 FutureTask 也实现 Runnable,所以可以只将 FutureTask 提供给 Executor。一些提交方法(如 ExecutorService.submit())除了提交任务之外,还将返回 Future 接口。
Future.get() 方法检索任务计算的结果(或如果任务完成,但有异常,则抛出 ExecutionException)。如果任务尚未完成,那么Future.get() 将被阻塞,直到任务完成;如果任务已经完成,那么它将立即返回结果。

 

利用 ConcurrentHashMap 中的原子 putIfAbsent() 方法,确保仅有一个线程试图计算给定关键字的值。如果其他线程随后请求同一关键字的值,它仅能等待(通过 Future.get() 的帮助)第一个线程完成。因此两个线程不会计算相同的值

 

while(true){
    Future<Long> deptV = glodDeptFutuMap.get(key);
    if (deptV == null) {
         Callable<Long> eval = new Callable<Long>(){
	 public Long call() throws Exception {
	     return Long(value);//返回计算结果值。。。。
                 }				
         };
        FutureTask<Long> ft = new FutureTask<Long>(eval);
        deptV = glodDeptFutuMap.putIfAbsent(key, ft);
        if (deptV == null) {
	deptV = ft;//指向 futuretask 获取到结果值
                ft.run();
         }						
   }
    try {
          value =  deptV.get();//等待多线程计算结果值
      } catch (InterruptedException e) {
            e.printStackTrace();
       } catch (ExecutionException e) {
           e.printStackTrace();
       }
      break;
}

 

 

 

 

 

 

 

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值