Java8简单的本地缓存实现
这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。因为Map有一个新的方法,在key为Null的时候自动计算一个新的value值。非常适合实现cache。来看下代码:
当然,这种方式很傻瓜。即使对于一个非常小的数,例如fibonacci(5),上面的代码也会打印出很多行,而且都是在进行重复计算,输出如下(只截取一部分):
Calculating f(6) Calculating f(4) Calculating f(2) Calculating f(3) Calculating f(2) Calculating f(5) Calculating f(3) Calculating f(2) Calculating f(4) Calculating f(2) Calculating f(3) Calculating f(2) f(6) = 8
我们想要做的就是创建一个缓存,用来计算斐波那契数列。最直接的方法就是在缓存中存放所有的value值。cache的创建如下:
static Map Integer, Integer cache = new ConcurrentHashMap ();
(译者注:这种写法在java8中是允许的)
声明cache之后,通过Map.computeIfAbsent() 方法,可以在key所对应的value值不存在的情况下,计算一个新的value值。超高速缓存(Caching)!由于这个方法是自动执行的,而且我们使用了 ConcurrentHashMap对象,这个缓存是线程安全的,不需要手动的去写同步方法。另外,它不仅仅可以处理斐波那契额数列,在其他地方也可以被重复使用。
不过现在,我们看看如何在fibonacci()方法中使用缓存。
瞧瞧。不能比这个再简单了吧。想要证明吗?好吧,我们在每次计算一个新值的时候,加上些日志:
程序输出如下:
f(0) = 0 f(1) = 1 Slow calculation of 2 f(2) = 1 Slow calculation of 3 f(3) = 2 Slow calculation of 4 f(4) = 3 Slow calculation of 5 f(5) = 5 Slow calculation of 6 f(6) = 8 Slow calculation of 7 f(7) = 13 Slow calculation of 8 f(8) = 21 Slow calculation of 9 f(9) = 34在Java7下又如何实现呢?
这样代码就会多一些,我们可以使用double-checked locking来实现:
注:你实际的解决方案很可能会用到Guava Caches。
总结:Lambdas 表达式是Java8中非常重要的一部分。同时我们不要忘记那些新添加到库中的,可以和Lambdas 配合使用的特性。
文章转自 并发编程网-ifeve.com
Java中基本类型和包装类的各类比较(==),以及包装类的对象缓存池 Java中的`基本类型`及其`包装类的比较(==)`一直是一个比较头疼的问题,不仅有`自动装箱和拆箱`操作,部分的包装类还有对象`缓存池`,这就导致了这部分知识容易混淆。 对于`==`操作符来说,如果比较的数据是`基本类型`,则比较它们的`值`,如果比较的是`对象`,则会比较`对象的内存地址`。另外,如果一个是基本类型、一个是包装类型,在比较前会先把包装类型`拆箱`成基本类型,然后进行比较。
相关文章
- Redis 缓存过期(maxmemory) 配置/算法 详解
- Java 中常用缓存Cache机制的实现《二》
- Java实现本地缓存
- Java实现 LeetCode 146 LRU缓存机制
- Java实现 LeetCode 146 LRU缓存机制
- Java实现 LeetCode 146 LRU缓存机制
- 应用中清理缓存应用实现
- 【高并发简单解决方案】redis缓存队列+mysql 批量入库+php离线整合
- Redis缓存实现排序功能
- 深入理解Spring Redis的使用 (八)、Spring Redis实现 注解 自动缓存
- django框架进阶-使用缓存-长期维护
- 从源代码分析Android-Universal-Image-Loader的缓存处理机制
- RequireJS禁止缓存
- nginx利用lua实现nginx反向代理proxy_store缓存文件自删除
- nginx利用lua实现nginx反向代理proxy_store缓存文件自删除
- 基于SpringBoot+Redis实现缓存消息验证
- 〖Python 数据库开发实战 - Python与Redis交互篇⑦〗- 利用 redis-py 实现缓存学生考试信息
- 学习Spring Boot:(二十一)使用 EhCache 实现数据缓存
- LRU 缓存机制实现:哈希表 + 双向链表
- 操作系统中的任务调度 & CPU 内存缓存一致性问题
- [译]Vulkan教程(17)帧缓存
- 笔记:NGINX 的 gzip 和缓存
- wazuh hids爆破攻击检测——可以看到wazuh是将爆破的原始事件缓存了,最终取证输出。
- Nginx配置之负载均衡、限流、缓存、黑名单和灰度发布
- Mybatis源码分析之(七)Mybatis一级缓存和二级缓存的实现
- ASP.NET Core 性能优化-缓存