`
liuxinglanyue
  • 浏览: 546871 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

(转)学习:一个并发的Cache

阅读更多

public class Memoizer implements Computable {
    private final ConcurrentMap> cache
        = new ConcurrentHashMap>();
    private final Computable c;

    public Memoizer(Computable c) { this.c = c; }

    public V compute(final A arg) throws InterruptedException {
        while (true) {
            Future f = cache.get(arg);
            if (f == null) {
                Callable eval = new Callable() {
                    public V call() throws InterruptedException {
                        return c.compute(arg);
                    }
                };
                FutureTask ft = new FutureTask(eval);
                f = cache.putIfAbsent(arg, ft); //先把FutureTask放进去再说
                if (f == null) { f = ft; ft.run(); } //开始计算
            }
            try {
                return f.get();
            } catch (CancellationException e) {
                cache.remove(arg, f);
            } catch (ExecutionException e) {
                throw launderThrowable(e.getCause());
            }
        }
    }
}
 这个Cache的设计很有意思, 考虑了很多并发的因素. Cache用简单的Map方式来实现.

1) 使用ConcurrentHashMap来存放计算结果
2) 最有趣的一点, ConcurrentHashMap 里存放的内容是 FutureTask. (为什么? 这相当于放一个Latch)
3) 使用了FutureTask来调度计算, 这样多个线程可以分别进行针对不同的参数的计算
4) 基于FutureTask的特性, 先把FutureTask放进了cache, 再对FutureTask计算
5) 用了一个 while(true) 无限循环…
(为什么? 因为如果发现已经有一个线程中进行相同的计算的话, 就直接等待计算结果. 但是等待过程中, 如果FutureTask被中断了呢? 抓住异常, 再等…)
6) 使用putIfAbsent操作, 避免出现两个线程都进行相同的计算

分享到:
评论

相关推荐

    CPU Cache and Memory Ordering

    网易杭研院何登成学习CPU架构以及并发程序设计的一些心得 与收获。主要内容包括: ...– 并发程序设计 (实现一个Spinlock,纠正一个Lock-Free Algorithm, Data Race (False-Sharing, Per-Processor Data))

    高性能高并发服务器架构大全

     一个很有意义的SQL的优化过程(一个电子化支局中的大数据量的统计SQL) 166  如何优化大数据量模糊查询(架构,数据库设置,SQL..) 168  求助:海量数据处理方法 169 # re: 求助:海量数据处理方法 回复 更...

    cyc学习笔记.pdf

    1、Integer缓存池范围-128~127都是同一个地址,在缓存池范围内赋值不会创建新的对象,且不开辟新内存空间。该缓存池由源码Integer.class中的IntegerCache这个私有静态内部类定义。该缓存池与jvm关系是:缓存池创建...

    基于深度学习的商品推荐系统源码.zip

    基于深度学习的商品推荐系统,高性能,可承受高并发,可跨平台。 技术栈 项目用到的技术如下: 语言:Python3 Java Web端:Layui,Flask,Nginx,Gevent,Flask_Cache 模型训练: PaddleRec , PaddlePaddle 深度...

    商品秒杀系统(限时抢购系统),包含商城展示与后台管理(毕业设计)

    添加一键部署,mybatis-plus逆向生成 其中融入短信通知(榛子云)、邮件通知(boot-starter-mail)、短信验证(kaptcha)、一二级缓存(JetCache)、跨域登录(jjwt)、数据库连接(druid),还包括自定义注解、切...

    JAVA上百实例源码以及开源项目源代码

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    基于SpringBoot的高并发选课系统源码+项目说明(毕设).zip

    本项目主要解决在高校选课场景下,保证选课系统在大量读写压力下不宕机,以及选课时尽可能提高选课QPS,给学生一个良好的选课体验,完成上述功能同时保证选课安全 ## 技术选型 前端:Bootstrap、JQuery、Thymeleaf ...

    JAVA上百实例源码以及开源项目

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    Guava 16.0 API (CHM格式)

    Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你...

    Ngnix学习指南电子版

    我参考着这个从对Nginx只知道这个名字开始,一步一步搭建成了每日50万PV的Web服务器实战。实践证明,Nginx确实比Apache在负担大访问量和并发数量上,要优越的多。这本书很值得学习揣摩。值得下载。

    软考中级软件设计师笔记.zip

    主存与 cache 地址映射方式地址映射方式:全相联映射-将主存一个块的地址与内容一起存入 cache 中,计算机 硬件系统 软件系统 输入设备 输出设备 存储器 运算器 控制器 内存储器 外存储器 算术逻辑单元ALU 累加...

    sesvc.exe 阿萨德

    本篇主要想讨论 ConcurrentHashMap 这样一个并发容器,在正式开始之前我觉得有必要谈谈 HashMap,没有它就不会有后面的 ConcurrentHashMap。 HashMap 众所周知 HashMap 底层是基于 数组 + 链表 组成的,不过在 jdk...

    Nginx:取代apache的高性能服务器

    Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达50 000个并发连接数的响应,运行稳定,且内存、CPU等系统资源消耗非常低。, 本书主要分为4个部分...

    Hibernate中文详细学习文档

    1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. ...

    实战Nginx:取代Apache的高性能Web服务器

    Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达50 000个并发连接数的响应,运行稳定,且内存、CPU等系统资源消耗非常低。  本书主要分为4个...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    java8集合源码-usefullinks:有用的编程链接

    Cache-coherency: Basics, MSI(除了文章,博客本身也很有趣) 程序员信奉的 CPU 缓存神话 微服务和架构: 如何设计 Web 应用程序:软件架构 101 系统设计面试 学习如何设计大型系统。 准备系统设计面试 弹性设计...

    Simple-Inference-Server:从头开始实现机器学习模型的推理服务器

    服务器设计为具有线程安全队列,其中所有推理请求都被保留,多个推理引擎工作线程将获得推理请求并并发处理。 用法 构建 Docker 镜像 $ docker build -f docker/server_amd64.Dockerfile --no-cache --tag=qa-...

    Oracle DBA 参考手册

    1.5. 我如何能够从一名DBA初学者变为一个具有中级水平的DBA? 14 1.5.1. 步骤#1: 学习操作系统和你的服务器硬件 14 1.5.2. 步骤#2: 学习应用程序设计因为它与数据库相关 14 1.5.3. 步骤#4: 取得认证 14 1.5.4. 步骤#...

Global site tag (gtag.js) - Google Analytics