`
liuxinglanyue
  • 浏览: 562678 次
  • 性别: 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))

    CACHE技术手册,强烈学习

    - **多值存储(MultiValue)**:CACHE支持多值存储模型,这种模型允许在一个记录中存储多个值,非常适合快速访问和处理大量数据。 - **全局变量(Global Variables)**:这是CACHE的一个独特特性,用于存储和检索数据。...

    Java并发编程与高并发解决方案-学习笔记

    - **单核处理器上的并发**: 在单核处理器上,虽然物理上只能执行一个线程,但通过快速地在多个线程间切换(即上下文切换),使得这些线程看起来像是同时运行。 - **多核处理器上的并发**: 在多核处理器上,每个线程...

    LocalCache 学习小记1

    【LocalCache 学习小记1】 LocalCache 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理...在处理高并发和热数据时,LocalCache 是一个有效的工具,可以在不影响应用性能的前提下提高服务响应速度。

    Cache数据库安装及编程相关资料

    这个压缩包包含了关于Cache数据库的安装和编程的相关资料,对于学习和理解Cache数据库的使用具有重要价值。 一、Cache数据库安装 1. 系统需求:在安装Cache数据库之前,你需要了解它对硬件和软件的要求,如操作系统...

    并发学习的补充资源整合包

    Maven是一个广泛使用的Java项目管理工具,它通过POM(Project Object Model)文件来管理项目的构建、依赖和报告。Maven 3.8.4是最新版本,提供了一些改进和修复,包括更快的构建速度、更好的依赖管理和错误处理。在...

    深入学习Buffer cache

    4. **Cache Buffer Chain Latch**:每个哈希桶都有一个缓存缓冲区链路锁,用于控制对Hash Chain的并发访问。当多个并发事务尝试访问同一数据块时,这些锁确保了数据的一致性和完整性。 5. **_db_block_hash_buckets...

    nginx cache 学习总结 1

    【Nginx Cache 学习总结】 在Nginx中,缓存机制是一个重要的功能,它可以帮助提升网站的响应速度,减少对后端服务器的压力。本文主要总结了Nginx缓存的一些关键指令和概念。 1. **proxy_cache**: - `proxy_cache...

    Java并发编程与高并发解决方案-学习笔记-www.itmuch.com.pdf

    比如,在MESI协议中,如果一个缓存行状态为M(_modified)表示数据只存在于本Cache中且与主存不一致,这时其他缓存想要该数据,就必须先从该缓存中获取。 ### Java内存模型 Java内存模型(Java Memory Model,JMM...

    Galbanum.Cache源代码

    9. **API设计**:一个优秀的开源项目,其API设计应该简洁易用,提供丰富的接口供开发者调用和扩展。 通过对Galbanum.Cache的源代码学习,开发者可以了解缓存系统的核心实现,掌握如何在.NET环境中优化数据存储和...

    Cache数据库编程和安装指南

    这意味着用户可以在同一个数据集中采用不同的访问方式,无需进行复杂的映射操作,极大地简化了开发流程并提高了效率。 - **对象访问**: 提供成熟的对象模型,使得开发者能够以面向对象的方式操作数据。 - **SQL访问...

    Cache数据库系统开发培训,非常好的资料.zip

    在IT领域,Cache数据库系统是一个重要的组成部分,特别是在高并发、实时数据处理和数据存储方面有着广泛的应用。Cache是由InterSystems公司开发的一种高性能、内存中的数据库管理系统,它主要用于处理大规模的数据...

    cache-api-1.0.0.jar

    总的来说,“cache-api-1.0.0.jar”是一个遵循JSR107规范的缓存API实现,它的存在简化了Java应用程序中缓存的集成和管理。通过使用这个API,开发者可以享受到标准缓存接口带来的便捷性,同时保证了与不同缓存实现的...

    医疗行业,Cache 面向对象软件开发 教程

    通过学习这个教程,开发者不仅可以掌握面向对象编程的基本技能,还能了解到如何将Cache技术融入到医疗系统的开发中,以提升系统的响应速度和整体效率。这将对医疗信息化的发展起到积极的推动作用,为患者提供更快捷...

    Java Cache 模拟器

    Java 缓存模拟器是一种用于理解和测试缓存行为的工具,它可以帮助开发者更好地理解...总的来说,Java Cache 模拟器是一个实践和学习缓存技术的宝贵工具,可以帮助我们深入理解缓存机制,并在实际开发中提升系统性能。

    springboot使用springCache和不使用springCache的对比.zip

    在Spring Boot应用中,Spring Cache是一个强大的功能,它允许我们以声明式的方式管理应用程序的缓存,从而提高性能。Spring Cache抽象了缓存提供者的具体实现,如 EhCache、Redis 或 Hazelcast,使得开发者可以方便...

    Cache数据库入门基础

    Cache支持分布式数据库架构,可以跨多个服务器部署,实现数据的冗余备份和负载均衡。这种特性确保了系统的高可用性和容错性,即使部分节点出现故障,整个系统仍能正常运行。 **6. 数据集成与接口** Cache提供多种...

    cache数据库脚本语言参考手册

    在这个例子中,我们定义了一个名为`SampleApp`的类,并在其内部定义了一个名为`Main`的方法。这个方法首先设置一个名为`name`的变量,并将其值设为“张三”。然后,使用`Write`命令将问候语输出到控制台。最后,通过...

    开源项目bfs,cache2go,groupcache

    学习Groupcache,开发者可以了解到如何在高并发环境下设计一个可扩展的缓存系统,以及如何利用Go语言的特性来实现这样的系统。 这三个开源项目提供了学习分布式文件系统和缓存技术的宝贵资源。通过深入分析和实践...

    开源项目-goburrow-cache.zip

    开源项目-goburrow-cache.zip 是一个基于Go语言实现的本地缓存库,它受到了Google的Guava Cache的启发,旨在为Go开发者提供类似于Guava Cache的功能。Guava Cache是Java开发中的一个流行缓存解决方案,而goburrow-...

Global site tag (gtag.js) - Google Analytics