构建高效可申缩的结果缓存

摘自<<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 {
                f.get(); // 阻塞,等待结果.如果已经在缓存中则不会阻塞
            } catch(CancellationException e) {
                cache.remove(arg, f);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

上述代码有多方面好处

1:计算与缓存他离,解偶

2:线程安全

3:支持并发

4:并发时不会重复计算,高效

时间: 2024-10-13 22:28:58

构建高效可申缩的结果缓存的相关文章

创业公司如何快速构建高效的监控系统?

12 月 7 日,在 2018 ArchSummit 全球架构师峰会·运维与监控专场,七牛云资深运维开发工程师贺强带来了主题为<如何快速构建高效的监控系统>的内容分享. 本文是对演讲内容的实录整理. 大家好,今天给大家带来的分享是如何在创业公司去搭建一套高效快速的运维系统.我演讲的主要内容有:谈到高效,我们如何来定义所谓的高效的监控系统:如何做好一个监控系统的选型和设计:七牛云内部的监控系统介绍:最后会和大家一起来探讨监控的发展趋势以及未来展望. 如何定义「高效」的监控系统? 在我认为,高效的

乌云章华鹏:如何构建高效的安全运维服务平台

如何构建高效的安全运维服务平台 大家好,我是乌云的章华鹏,今天和大家分享的话题是"高效安全运维服务平台的构建",包括:企业的数据安全问题,运维安全中面临的网络.系统服务.应用相关配置等问题. 企业安全的核心是数据安全 当我们在讨论如何构建安全运维服务平台之前,我们需要考虑的问题是构建这样一个平台的核心需求是什么?核心需求是帮助企业解决安全风险,避免因为安全风险带来的业务损失. 我们都知道对于一个依赖互联网的企业来说,数据是企业的核心资产,那么归根结底,其实企业安全的核心是数据安全,所以

微软构建高效DevOps团队培训总结

9.21和9.22这两天参加了微软DevOps的培训,主要是围绕TFS2015的不少新功能来讲的,相比较之前我们一直使用TFS2013来管理团队,确实强大了不少,也更加实用了. 首先,什么是DevOps? 运维说主要是发布管理.CI持续集成的,开发说是开发测试一体化的,项目经理说是项目流程管理的...其实都没错,只是都不全面.百度百科上较严格的定义,不过它的似乎就是像开源社区一样,是经过大家集思广益,各自的经验方法总结而形成的一套覆盖软件开发运维流程的经验论. 目标人群 (第1天)企业研发经理,

高效地加载图片(三) 缓存图片

如果只需要加载一张图片,那么直接加载就可以.但是,如果要在类似ListView,GridView或者ViewPager的控件中加载大量的图片时,问题就会变得复杂.在使用这类控件时,在短时间内可能会显示在屏幕上的图片数量是不固定的. 这类控件会通过子View的复用来保持较低的内存占用.而Garbage Collector也会在View被复用时释放对应的Bitmap,保证这些没用用到的Bitmap不会长期存在于内存中.但是为了保证控件的流畅滑动,在一个View再次滑动出现在屏幕上时,我们需要避免图片

使用Nginx+CppCMS构建高效Web应用服务器(之三)

使用Nginx+CppCMS构建高效Web应用服务器(之三) --充分利用服务器和客户端计算能力 欢迎测试,攻击:http://www.litelottery.com     网页右上角,选择博彩,演示双色球开奖记录,更多功能,稍后添加. 1:闲言碎语不要讲,Nginx+CppCMS搭建请参见之一. 2:此讲集中说明一个实例:使用Nginx+CppCMS+C/C++和Redis实现高效的后台服务,客户端使用H5的JS转移计算到客户端. 双色球开奖历史号码获取,存储,客户端获取号码列表,Redis

高职语文构建高效课堂中开展竞赛课堂

一.高职语文开展竞赛课堂现状 高职教育在我国得到了较快的发展,但是高职语文教育中存在的问题应引起社会的足够重视.目前高职语文在教学中存在着一些问题,极大地制约了语文教育质量的提高. (一)职校语文教学课程管理不当,为适应新形势对职校学生的技能要求,提高学生的技能,许多职校减少文化基础课时,修改语文基础课教材,不重视语文基础教学.学校对职业教育文化基础课教学的现状与问题认识偏颇,对文化基础课教学忽视,导致学生厌学,进入职校的学生,学习语文只是应付学校考试,导致语文学习动力不足.此外,职校语文课堂教

Java并发(具体实例)—— 构建高效且可伸缩的结果缓存

这个例子来自<Java并发编程实战>第五章.本文将开发一个高效且可伸缩的缓存,文章首先从最简单的HashMap开始构建,然后分析它的并发缺陷,并一步一步修复. hashMap版本 首先我们定义一个Computable接口,该接口包含一个compute()方法,该方法是一个耗时很久的数值计算方法.Memoizer1是第一个版本的缓存,该版本使用hashMap来保存之前计算的结果,compute方法将首先检查需要的结果是否已经在缓存中,如果存在则返回之前计算的值,否则重新计算并把结果缓存在Hash

[转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统.众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的 成熟,越来越多的系统开始转型为LNMP(Linux+Nginx+MySQL+PHP with fpm),这是因为Nginx采用基于事件机制的I/O多路复用思想设计,在高并发情况下其性能远远优于默认采用prefork模式的Apache,另 外,相对于Apache,Nginx更轻量,同时拥有大量优秀的扩展模块,使得在Nginx上可以

构建高效安全的Nginx Web服务器

一 一.为什么选择Nginx搭建Web服务器 Apache和Nginx是目前使用最火的两种Web服务器,Apache出现比Nginx早. Apache HTTP Server(简称Apache)是世界使用排名第一的Web服务器软件, 音译为阿帕奇,是Apache软件基金会的一个开放源码Web服务器, 可以运行几乎所有的计算机平台,其次开放的API接口, 任何组织和个人都可以在它上面扩展和增加各种需要功能,达到为自己量身定制的功能. Nginx("engine x")是一个高性能的HTT