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架构以及并发程序设计的一些心得 与收获。主要内容包括: ...– 并发程序设计 (实现一个Spinlock,纠正一个Lock-Free Algorithm, Data Race (False-Sharing, Per-Processor Data))
- **多值存储(MultiValue)**:CACHE支持多值存储模型,这种模型允许在一个记录中存储多个值,非常适合快速访问和处理大量数据。 - **全局变量(Global Variables)**:这是CACHE的一个独特特性,用于存储和检索数据。...
- **单核处理器上的并发**: 在单核处理器上,虽然物理上只能执行一个线程,但通过快速地在多个线程间切换(即上下文切换),使得这些线程看起来像是同时运行。 - **多核处理器上的并发**: 在多核处理器上,每个线程...
【LocalCache 学习小记1】 LocalCache 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理...在处理高并发和热数据时,LocalCache 是一个有效的工具,可以在不影响应用性能的前提下提高服务响应速度。
这个压缩包包含了关于Cache数据库的安装和编程的相关资料,对于学习和理解Cache数据库的使用具有重要价值。 一、Cache数据库安装 1. 系统需求:在安装Cache数据库之前,你需要了解它对硬件和软件的要求,如操作系统...
Maven是一个广泛使用的Java项目管理工具,它通过POM(Project Object Model)文件来管理项目的构建、依赖和报告。Maven 3.8.4是最新版本,提供了一些改进和修复,包括更快的构建速度、更好的依赖管理和错误处理。在...
4. **Cache Buffer Chain Latch**:每个哈希桶都有一个缓存缓冲区链路锁,用于控制对Hash Chain的并发访问。当多个并发事务尝试访问同一数据块时,这些锁确保了数据的一致性和完整性。 5. **_db_block_hash_buckets...
【Nginx Cache 学习总结】 在Nginx中,缓存机制是一个重要的功能,它可以帮助提升网站的响应速度,减少对后端服务器的压力。本文主要总结了Nginx缓存的一些关键指令和概念。 1. **proxy_cache**: - `proxy_cache...
比如,在MESI协议中,如果一个缓存行状态为M(_modified)表示数据只存在于本Cache中且与主存不一致,这时其他缓存想要该数据,就必须先从该缓存中获取。 ### Java内存模型 Java内存模型(Java Memory Model,JMM...
9. **API设计**:一个优秀的开源项目,其API设计应该简洁易用,提供丰富的接口供开发者调用和扩展。 通过对Galbanum.Cache的源代码学习,开发者可以了解缓存系统的核心实现,掌握如何在.NET环境中优化数据存储和...
这意味着用户可以在同一个数据集中采用不同的访问方式,无需进行复杂的映射操作,极大地简化了开发流程并提高了效率。 - **对象访问**: 提供成熟的对象模型,使得开发者能够以面向对象的方式操作数据。 - **SQL访问...
在IT领域,Cache数据库系统是一个重要的组成部分,特别是在高并发、实时数据处理和数据存储方面有着广泛的应用。Cache是由InterSystems公司开发的一种高性能、内存中的数据库管理系统,它主要用于处理大规模的数据...
总的来说,“cache-api-1.0.0.jar”是一个遵循JSR107规范的缓存API实现,它的存在简化了Java应用程序中缓存的集成和管理。通过使用这个API,开发者可以享受到标准缓存接口带来的便捷性,同时保证了与不同缓存实现的...
通过学习这个教程,开发者不仅可以掌握面向对象编程的基本技能,还能了解到如何将Cache技术融入到医疗系统的开发中,以提升系统的响应速度和整体效率。这将对医疗信息化的发展起到积极的推动作用,为患者提供更快捷...
Java 缓存模拟器是一种用于理解和测试缓存行为的工具,它可以帮助开发者更好地理解...总的来说,Java Cache 模拟器是一个实践和学习缓存技术的宝贵工具,可以帮助我们深入理解缓存机制,并在实际开发中提升系统性能。
在Spring Boot应用中,Spring Cache是一个强大的功能,它允许我们以声明式的方式管理应用程序的缓存,从而提高性能。Spring Cache抽象了缓存提供者的具体实现,如 EhCache、Redis 或 Hazelcast,使得开发者可以方便...
Cache支持分布式数据库架构,可以跨多个服务器部署,实现数据的冗余备份和负载均衡。这种特性确保了系统的高可用性和容错性,即使部分节点出现故障,整个系统仍能正常运行。 **6. 数据集成与接口** Cache提供多种...
在这个例子中,我们定义了一个名为`SampleApp`的类,并在其内部定义了一个名为`Main`的方法。这个方法首先设置一个名为`name`的变量,并将其值设为“张三”。然后,使用`Write`命令将问候语输出到控制台。最后,通过...
学习Groupcache,开发者可以了解到如何在高并发环境下设计一个可扩展的缓存系统,以及如何利用Go语言的特性来实现这样的系统。 这三个开源项目提供了学习分布式文件系统和缓存技术的宝贵资源。通过深入分析和实践...
开源项目-goburrow-cache.zip 是一个基于Go语言实现的本地缓存库,它受到了Google的Guava Cache的启发,旨在为Go开发者提供类似于Guava Cache的功能。Guava Cache是Java开发中的一个流行缓存解决方案,而goburrow-...