函数式编程-记忆化缓存

Java26

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

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

打印结果:

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

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

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

打印结果:

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

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

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

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长

相关文章
java 异常类与自定义异常 Java

java 异常类与自定义异常

目录 异常类 Exception 类的层次 throws/throw 关键字: throws: throw: try catch finally语句 声明自定义异常 异常类 在 Java 中一个异常的...
Java学习 (18) Java数组篇(02)数组特点&数组边界 Java

Java学习 (18) Java数组篇(02)数组特点&数组边界

数组的特点 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。 其元素必须是相同类型,不允许出现混合类型。 数组中的元素可以是任何数据类型,包括基本类型和引用类型。 *数组变量属引用类型,数组...
Java(12)静态字段与静态方法 Java

Java(12)静态字段与静态方法

之前我们都定义的 main方法都被标记了 static修饰符,那到底是什么意思?下面我们来看看 静态字段 如果将一个字段定义为 static,每个类只有一个这样的字段。而对于非静态的实例字段,每个对象...
实现get/post请求调用第三方接口 Java

实现get/post请求调用第三方接口

使用http协议中的get以及post方式对接第三方平台在工作中很常见,我所展示的已是将方法归纳好,只需要按照对接方案传递对应的参数即可。 下载地址 https://download.csdn.net...
SpringBoot-多线程 Java

SpringBoot-多线程

一、配置 ```java @Configuration @EnableAsync //启用异步任务 public class ThreadPoolConfig { @Bean("taskExecuto...
我使用Spring AOP实现了用户操作日志功能 Java

我使用Spring AOP实现了用户操作日志功能

我使用Spring AOP实现了用户操作日志功能 今天答辩完了,复盘了一下系统,发现还是有一些东西值得拿出来和大家分享一下。 需求分析 系统需要对用户的操作进行记录,方便未来溯源 第一个想法是在每种方...
Java学习 (14) Java方法篇(01)方法定义和调用 Java

Java学习 (14) Java方法篇(01)方法定义和调用

方法的定义 方法的组成结构 语法实例 方法的调用 语法实例 方法的定义 Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段 *方法包含一个方法头和一个方法体。 方法的组成结构 修饰符...
java设计模式 Java

java设计模式

开闭原则:是指一个软件实体如类、模块和函数应该对扩展开放, 对修改关闭 依赖反转原则:指在设计代码结构时,高级模块不应依赖于低级模块,两者都应依赖于它们的抽象而不是具体。[En]Dependency ...
【上海】常见笔试题 Java

【上海】常见笔试题

【上海】φ笔试题 1. JDK、 JRE、JVM关系是什么 Jdk是Java语言软件开发工具包,其中就包含了jre ​ JRE是运行环境,包含JVM标作实现及Java核心类库 JVM是Java的虚拟机...
JavaSE-对象所有字段判空 Java

JavaSE-对象所有字段判空

```java /* * 判断该对象是否所有属性为空 * 返回ture表示所有属性为null,返回false表示不是所有属性都是null / public static boolean isAllFi...
spring多数据源配置笔记 Java

spring多数据源配置笔记

本文阐述使用多数据源的额场景,以及如何使用springboot的配置多数据源。 关于后者,主要是直接引用其它博文:https://blog.csdn.net/u012060033/article/de...
大厂是怎么进行SQL调优的? Java

大厂是怎么进行SQL调优的?

这天我正在午休呢,公司DBA就把我喊醒了,说某库出现大量慢SQL,很快啊,很快,我还没反应过来,库就挂了,我心想现在的用户不讲武德啊,怎么在我睡觉的时候大量请求呢。 这是很常见的一个场景哈,因为很多业...
【每日算法】位运算 Java

【每日算法】位运算

什么是位运算 运算符 与 基础运算 与运算的用途 判断奇偶 判断一个数是否为2的整数幂 二进制中1的个数 或 基础运算 或运算的用途 异或 基础运算 异或运算的用途 交换两个数 任何数异或自己=把自己...