记忆化,是一种为了提高应用程序性能的FP技术。程序加速是通过缓存函数的结果实现的,避免了重复计算带来的额外开销。
1、现在我们使用Dictionary作为缓存结构
打印结果:
可以看出第三次打印的结果跟第一次打印的结果相同,也就是被缓存在Dictionary中的值。
在单线程中我们这样写没有问题,程序顺序被执行,Dictionary不存在并发问题,但是当我们想在多个线程并行时Dictionary不是线程安全集合,会存在线程安全问题。
2、现在我们使用线程安全集合ConcurrentDictionary进行改进:(方法中注释已经对方法做了说明,在此不重复)
打印结果:
注解中我们说明了ConcurrentDictionary是线程安全集合,但是当我们使用GetOrAdd时,由于该方法不是原子性的操作,当进行初始化时,可能多个线程同时进行初始化操作,带来了额外的开销。
3、为解决GetOrAdd非原子性操作重复初始化操作,引入延迟初始化(注解已详细说明):
在看改进方法前我们先看下Lazy类的用法:
相关文章

java 异常类与自定义异常
目录 异常类 Exception 类的层次 throws/throw 关键字: throws: throw: try catch finally语句 声明自定义异常 异常类 在 Java 中一个异常的...

Java学习 (18) Java数组篇(02)数组特点&数组边界
数组的特点 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。 其元素必须是相同类型,不允许出现混合类型。 数组中的元素可以是任何数据类型,包括基本类型和引用类型。 *数组变量属引用类型,数组...

Java(12)静态字段与静态方法
之前我们都定义的 main方法都被标记了 static修饰符,那到底是什么意思?下面我们来看看 静态字段 如果将一个字段定义为 static,每个类只有一个这样的字段。而对于非静态的实例字段,每个对象...

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

SpringBoot-多线程
一、配置 ```java @Configuration @EnableAsync //启用异步任务 public class ThreadPoolConfig { @Bean("taskExecuto...

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

ucore操作系统学习(二) ucore lab2物理内存管理分析
一、lab2物理内存管理介绍 操作系统的主要职责之一是管理硬件资源,并为应用程序提供使用这些资源的抽象良好的接口。[En]One of the main responsibilities of the...

Java学习 (14) Java方法篇(01)方法定义和调用
方法的定义 方法的组成结构 语法实例 方法的调用 语法实例 方法的定义 Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段 *方法包含一个方法头和一个方法体。 方法的组成结构 修饰符...

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

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

JavaSE-对象所有字段判空
```java /* * 判断该对象是否所有属性为空 * 返回ture表示所有属性为null,返回false表示不是所有属性都是null / public static boolean isAllFi...

spring多数据源配置笔记
本文阐述使用多数据源的额场景,以及如何使用springboot的配置多数据源。 关于后者,主要是直接引用其它博文:https://blog.csdn.net/u012060033/article/de...

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

【Unity Shader学习笔记】Unity光照-阴影
1、原理 一个对象在其他对象上投射阴影,以及一个对象如何接收其他对象的阴影。[En]One object casts shadows on other objects, and how one obj...

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