函数式编程-记忆化缓存

记忆化,是一种为了提高应用程序性能的FP技术。程序加速是通过缓存函数的结果实现的,避免了重复计算带来的额外开销。

1、现在我们使用Dictionary作为缓存结构

打印结果:

可以看出第三次打印的结果跟第一次打印的结果相同,也就是被缓存在Dictionary中的值。

在单线程中我们这样写没有问题,程序顺序被执行,Dictionary不存在并发问题,但是当我们想在多个线程并行时Dictionary不是线程安全集合,会存在线程安全问题。

2、现在我们使用线程安全集合ConcurrentDictionary进行改进:(方法中注释已经对方法做了说明,在此不重复)

打印结果:

注解中我们说明了ConcurrentDictionary是线程安全集合,但是当我们使用GetOrAdd时,由于该方法不是原子性的操作,当进行初始化时,可能多个线程同时进行初始化操作,带来了额外的开销。

3、为解决GetOrAdd非原子性操作重复初始化操作,引入延迟初始化(注解已详细说明):

在看改进方法前我们先看下Lazy类的用法:

输出:

以下为Lazy类代码片段,从代码我们看出在对象未使用(value)前,实例并未真正创建:

现在我们看下改进方法:

到现在方法的线程安全、初始化加载问题都解决了,但是我们在解决重复计算的问题后却又不得不考虑缓存带来的内存损耗问题。我们实例化了ConcurrentDictionary对象,并且该对象作为强引用类型一直未被释放,那么GC是无法回收该对象,带来的问题是内存一直被占用,随着方法引用次数越来越多内存开销则会越来越大。

4、为解决该问题,我们引入过期时间,根据过期时间释放缓存值。

其他实现方式,使用WeakReference弱引用类型(以下为使用示例):

打印结果:

具体实现方式不在此实现。

Original: https://www.cnblogs.com/xtt321/p/14220813.html
Author: 温暖如太阳
Title: 函数式编程-记忆化缓存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593287/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 为什么一定要从DevOps走向BizDevOps?

    数字经济时代,数字化转型成为社会的普遍共识和行动。越来越多的业务运行在数字化基座之上, 软件系统正成为业务创新的价值核心和创新引擎。在这一趋势下,软件产业面临着许多新挑战和新机遇:…

    Java 2023年6月8日
    071
  • 在网页中使用超链接来打开本地应用(可传参数)

    如果你想要通过超链接来打开本地应用,那么你首先你需要将你的应用添入windows注册表中(这样网页就可以通过指定代号来调用程序),由于安全性的原因所以网页无法直接通过输入绝对路径来…

    Java 2023年6月13日
    082
  • SpringBoot 系列 web 篇之自定义返回 Http Code 的 n 种姿势

    虽然 http 的提供了一整套完整、定义明确的状态码,但实际的业务支持中,后端并不总会遵守这套规则,更多的是在返回结果中,加一个 code 字段来自定义业务状态,即便是后端 5xx…

    Java 2023年5月30日
    062
  • 小众网站

    AI音乐推荐 https://www.gnoosic.com/faves.phpRAP https://foreignrap.com壁纸 https://wallhaven.cc/…

    Java 2023年6月5日
    081
  • 设计模式——行为型设计模式

    行为型设计模式 针对对象之间的交互 解释器模式 java中用的很。JVM编译的时候就是对我们写的代码进行了解释操作;数据库SQL语句亦是如此 解释器:对语言进行解释,根据不同语义来…

    Java 2023年6月14日
    081
  • [游戏引擎中文版]YU-RIS 4.5 最新中文支持版

    今天给大家带来一个很重要的引擎——YU-RIS 相对于复杂的krkr2,YU-RIS要可爱的多。 为什么我要说她很重要呢? 我看过不下10篇,日本GAL引擎 介绍 基本每一篇都会介…

    Java 2023年5月29日
    084
  • 实力总结四类Bean注入Spring的方式

    一提到 Spring,大家最先想到的是啥?是 AOP和 IOC的两大特性?是 Spring中 Bean的初始化流程?还是基于 Spring的 Spring Cloud全家桶呢? 今…

    Java 2023年6月5日
    0109
  • 1.Spring jar包依赖

    <dependency> <groupid>commons-cli</groupid> <artifactid>commons-cl…

    Java 2023年6月13日
    096
  • 上传图像

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月6日
    095
  • mysql慢查询日志总结

    查看慢查询是否开启: mysql>show variables like ‘%slow_query_log%’; Variable_name Valu…

    Java 2023年6月5日
    059
  • 深入理解CAS思想之原子操作类详解

    前置知识(CAS部分) (1)什么是 CAS 1.CAS(Compare And Swap,比较并交换),通常指的是这样一种原子操作: 针对一个变量,首先比较它的内存值与某个期望值…

    Java 2023年6月16日
    066
  • Docker 部署前后端项目

    Docker 部署前后端项目 平生不会相思,才会相思,便害相思。 简介:都是被逼的,从零开始一个Docker 部署九个微服务和三个前端项目。其中,这些服务需要用到Nacos、MyS…

    Java 2023年6月5日
    092
  • HTTP缺点有哪些,如何解决

    前言 大家好,我是蜗牛,在上一篇中,我们介绍了不同版本的HTTP区别和发展背景,这篇文章我们来聊聊HTTP的缺点,HTTP缺点大致总结有以下三点: 通信使用明文(不加密),内容可能…

    Java 2023年6月15日
    0106
  • 流式结构化数据计算语言的进化与新选择

    JAVA开发中经常会遇到不方便使用数据库,但又要进行结构化数据计算的场景。JAVA早期没有提供相关类库,即使排序、分组这种基本计算也要硬写代码,开发效率很低。后来JAVA8推出了S…

    Java 2023年6月15日
    075
  • WordPress网站中添加百度统计代码

    百度统计是流量分析平台,帮助收集网站访问数据,提供流量趋势、来源分析、转化跟踪、页面热力图、访问流等多种统计分析服务,同时与百度搜索、百度推广、云服务无缝结合,为网站的精细化运营决…

    Java 2023年6月8日
    084
  • 2022-8-15 数据库 mysql 第一天

    Mysql数据库 数据库 数据库【按照数据结构来组织、存储和管理数据的仓库】。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 数据对于公司来说最宝贵的财…

    Java 2023年6月13日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球