java懒加载实现

news2024/11/15 17:06:06

 

懒加载,也称为“不需要”加载,是一种内存管理方式。在 Java中,当一个类不再使用时,就会将其转化为另一个类对象。这也是所谓的“垃圾回收”。java中的懒加载有三种方式: 3、在对象被回收时,会将其销毁。 在这三种方式中,最常用的是第二种方式(在 java. util.java.util.co ncur rent中):

  • 1.什么是懒加载

    在 Java中,有三种方式可以实现懒加载: 1、通过对象头来实现 2、通过继承类库来实现 首先我们需要声明一个对象,这个对象在编译期不会被加载,但是在运行期时,会被编译器加载到内存中。例如:一个类的元数据信息:。 class ()。 libc中有两个属性:。 classList和。 libc。当运行时,如果类中的所有方法都已经加载完毕,这个类就会被加载到内存中,如果这个类没有被加载,那么就不会被加载。例如:当一个类在运行时,如果类中的所有方法都已经被执行完毕了,那么这个类就会被加载到内存中,然后将其转换为。 classList。同样的如果一个方法在运行时没有被执行完,那么这个方法就不会被加载到内存中。例如:当一个类的元数据信息:。 classList和。 libc时,如果这个类已经被执行完毕了,那么这个类就不会被加载到内存中。这三种实现方式都是通过对象头来实现的。

  • 2.为什么需要懒加载

    懒加载的作用主要是为了解决程序运行时会发生内存泄漏的问题,具体有以下几点: 1)当一个类不再使用时,如果它是通过加载的方式来实现,那么这个类中的静态变量就会被释放,因为静态变量是不需要加载的;如果不加载,那么就会释放它所在内存中的引用,从而导致整个类都无法再使用。 2)当一个类不再使用时,如果这个类被 new出来,那么对象还没有被销毁时,它就会被 new出来的对象所引用;如果对象是通过反射调用的方式创建出来的,那么这个类中的静态变量也会被释放掉。 3)当一个类不再使用时,如果这个类没有实例化过,那么在编译期它就会被设置为不可变类型;如果没有实例化过这个对象,那么它就会被垃圾回收机制所回收。 4)如果一个类不再使用时,该对象又被其他程序使用了一次(就是调用了该方法),那么就会引发垃圾回收机制;如果该对象是通过反射调用的方法创建出来的,那么就不会引发垃圾回收机制。 5)当一个类不再使用时,该对象还没有被销毁时。

  • 3.什么是 JVM的垃圾回收器

    Java虚拟机的垃圾回收器(JVM Stack Executor),是一个虚拟机监视器,它监测程序内存中是否存在不应该被使用的对象,如果发现,将它清除。垃圾回收器也称为内存回收器,是基于标记-清除算法实现的,这种算法是一种标记-清除算法(marking- clean algorithm)。该算法的具体实现分为两个部分: 1)标记-清理(marking- clean algorithm):该算法先对内存中的对象进行扫描,查找是否有自己不需要的对象存在。如果有的话就将它清除。 2)清理-复制(replacement algorithm):该算法是基于标记-清除算法的一种优化算法,在标记阶段会对内存中的对象进行扫描,找到内存中是否存在不需要的对象,如果存在就将其清除。如果没有发现则会将内存中的对象复制到新的地方。

  • 4. JVM的垃圾回收器如何实现懒加载

    Java中的垃圾回收器是由多个部分组成的,每一个部分都有自己的工作原理和实现方式。 JVM垃圾回收器可以分为以下四个部分: 执行: Java虚拟机执行垃圾回收器的第一步就是为每一个对象分配空间,在此阶段, Java虚拟机将为每一个对象分配内存空间。每个对象都会有一块虚拟内存区域,它是由引用变量和对象两个部分组成的。在虚拟机中,每个对象都有一个指向该对象的引用变量。 准备:在分配完内存空间后,下一步就是要为每个对象设置一个标记变量,标记这个对象是属于哪个类的。Java虚拟机中,标记变量分为两种:一种是直接标记法(直接将标记值赋给类或接口);另一种是间接标记法(通过一个计数器来实现)。 检测:当给每个对象分配完内存空间后, JVM会检查每个对象是否与本地变量表中的引用一致,如果不一致,则说明这个对象属于非引用类型。

  • 5.懒加载在 java中的作用

    (1)。懒加载可以解决重复加载的问题。在 Java中,对于同一个类,同一个变量,只需要在被调用的时候才会被赋值一次。因此如果需要在多个地方使用这个类的话,就需要在不同的地方都加上这个类。但是如果有两个类,一个类使用到了该方法,另一个类则不需要再使用该方法了,那么就可以通过懒加载来实现代码复用。 (2)。当一个类的对象被回收时,则这个对象会被销毁。如果对象是通过 new创建的,那就会创建出一个新的对象。但是如果这个对象是通过 setnx ()方法被创建的,则不需要再进行 new操作。 (3)。懒加载可以让 JVM更好地管理内存。 (4)。懒加载可以更好地实现安全隔离。在 Java中,如果两个类都没有被使用时,那就不需要对它们进行同步操作了。而如果其中一个类没有被使用时,另一个类也不需要被使用。这就避免了在两个实例之间进行同步操作所产生的风险了。

  • 6.如何使用 Java语言实现懒加载

    上面我们说过,当一个类不再使用时,就会把它的引用类型变为 null,然后创建一个新的对象来继承这个类。这样,通过懒加载,我们就可以在不修改原有代码的情况下,对已有的类进行修改。 如果想要实现懒加载,我们可以使用 ClassLoader类来实现: 在这个 ClassLoader中会有一个实例对象实例化的方法,就是 java. util.java.util.co ncur rent. ClassLoader ()。在这个类中我们可以对其进行懒加载。由于懒加载在 Java语言中是一种非常常见的机制,所以我们一般不会去使用它。

懒加载(Lazy Loading)是一种常见的设计模式,用于在需要时才实例化对象。这种方式可以提高程序的性能,特别是在处理大型对象和资源密集型应用时。以下是几种常见的Java懒加载代码示例:
1. 双重检查锁定(Double-Checked Locking)
```java
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
2. 静态内部类(Static Inner Class)
```java
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
3. 使用Java 8的`Optional`类实现懒加载
```java
import java.util.Optional;
public class LazyLoading {
private Optional<String> value = Optional.empty();
public String getValue() {
if (!value.isPresent()) {
synchronized (this) {
if (!value.isPresent()) {
value = Optional.of("Hello, World!");
}
}
}
return value.get();
}
}
```
4. 使用`AtomicReference`实现懒加载
```java
import java.util.concurrent.atomic.AtomicReference;
public class LazyLoading {
private AtomicReference<String> value = new AtomicReference<>();
public String getValue() {
String currentValue = value.get();
if (currentValue == null) {
synchronized (this) {
currentValue = value.get();
if (currentValue == null) {
currentValue = "Hello, World!";
value.set(currentValue);
}
}
}
return currentValue;
}
}
```
以上就是几种常见的Java懒加载代码示例。在实际项目中,可以根据具体需求选择合适的懒加载方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467046.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DIY可视化必看教程 FLEX组件使用,教大家如何布局界面

DIY可视化必看教程FLEX组件使用 水平布局实现、两端对齐 1、拖个FLEX组件过来&#xff0c;排列方向改为水平。 2、拖个文件内容组件进去、栅格化到0 3、复制多一个文本内容组件 4、修改FLEX组件显示对齐方式 5、图标对齐 6、修改FLEX组件对齐方式 7、修改中间占位大&#xff0…

Windows 11 本地 php环境搭建:PHP + Apache + MySQL 安装和环境配置

目录 前言1. PHP 的下载、安装和配置1.1 下载 php1.2 安装 php1.3 配置 php 系统变量1.4 配置 php.ini 2. Apache 的下载、安装和配置2.1 下载 Apache2.2 安装 Apache2.3 修改配置 Apache2.4 指定服务端口&#xff08;非必须&#xff09;2.5 配置系统变量2.6 安装服务2.7 启动服…

计算机网络闲谈01——QUIC协议

计算机网络闲谈01——QUIC协议 预备知识 重传机制 RTT 一个连接的往返时间 RTO 重传超时时间 RTT和RTO 的关系是&#xff1a;由于网络波动的不确定性&#xff0c;每个RTT都是动态变化的&#xff0c;所以RTO也应随着RTT动态变化。 流量控制 对发送方发送速率的控制 称之为…

【BIM+GIS】BIM模型导入GIS软件之前的一些处理设置

文章目录 一、模型位置发生偏移二、模型对象丢失或增加三、模型材质发生变化四、导出过程缓慢五、模型属性批量丢失一、模型位置发生偏移 在视图→可见性/图形替换模型类别→场地(VV可见性快捷),勾选项目基点。 单击选中项目基点,在属性中修改几点坐标。 即使修改了项目基…

界面控件DevExpress Blazor UI v22.2 - 支持.NET 7

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具&#xff0c;该组件拥有众多新产品和数十个具有高影响力的功能&#xff0c;可为桌面、Web和移动应…

# Java 并发编程的艺术(二)

Java 并发编程的艺术&#xff08;二&#xff09; 文章目录 Java 并发编程的艺术&#xff08;二&#xff09;并发编程的挑战上下文切换如何减少上下文的切换 死锁资源限制的挑战 Java 并发机制的底层实现原理volatile 的应用synchronized 的实现原理与应用三大特性实现原理 Java…

智慧冷链园区三维可视化,数字孪生助力大数据实时监控

近年来&#xff0c;业界学者及企业就智慧冷链物流展开深入研究&#xff0c;2010 年 IBM 发布的《智慧的未来供应链》研究报告中提出智慧供应链概念&#xff0c;并由此延伸出智慧物流概念&#xff0c;即智慧物流是以信息化为依托并广泛应用物联网、人工智能、大数据、云计算等技…

基于U-Net系列的医学图像分割

U-Net 在FCN 的基础上增加了上采样操作的次数和跳跃连接&#xff0c;使用跳跃连接将解码器的输出特征与编码器的语义特征融合&#xff0c;提高了分割精度&#xff0c;改善了 FCN 上采样不足的问题。 U-Net中没有全连接层&#xff0c;通过互连卷积与反卷积过程中的特征&#xff…

一文打通java泛型

目录 为什么要有泛型 生活场景 泛型的设计背景 泛型的概念 那么为什么要有泛型呢&#xff0c;直接Object不是也可以存储数据吗&#xff1f; 在集合中使用泛型 自定义泛型结构 注意点 自定义泛型结构&#xff1a;泛型类 自定义泛型结构&#xff1a;泛型方法 泛型在…

【微服务笔记23】使用Spring Cloud微服务组件从0到1搭建一个微服务工程

这篇文章&#xff0c;主要介绍如何使用Spring Cloud微服务组件从0到1搭建一个微服务工程。 目录 一、从0到1搭建微服务工程 1.1、基础环境说明 &#xff08;1&#xff09;使用组件 &#xff08;2&#xff09;微服务依赖 1.2、搭建注册中心 &#xff08;1&#xff09;引入…

网课/网校/知识付费/在线教育系统,100%全功能开源,可免费商用

一、开源项目简介 酷瓜云课堂&#xff0c;依托腾讯云基础服务架构&#xff0c;采用C扩展框架Phalcon开发&#xff0c;GPL-2.0开源协议&#xff0c;致力开源网课系统&#xff0c;开源网校系统&#xff0c;开源知识付费系统&#xff0c;开源在线教育系统。 酷瓜云课堂 - 网课系…

【LeetCode: 322. 零钱兑换 | 暴力递归=>记忆化搜索=>动态规划 | 背包模型】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

JavaScript 知识总结中篇(更新版)

72.get 请求传参长度的误区 常说&#xff1a;get 请求参数的大小存在限制&#xff0c;而 post 请求的参数大小无限制。 实际上 HTTP 协议并未规定 get / post 的请求参数大小限制。 纠正误区&#xff1a;是浏览器或 web 服务器对 get 请求参数的最大长度显示进行限制&#xf…

Nature Neuroscience:高家红团队首次发布中国人脑连接组计划研究成果及其大数据资源

人类生活在充满多样性的世界里。长久以来的研究发现&#xff0c;人类的脑与行为受到基因、环境和文化及其相互作用的塑造&#xff0c;然而这种影响发生的机制始终缺乏系统性探索与研究。近年来&#xff0c;前沿神经影像技术方法飞速进步&#xff0c;推动着多模态脑成像大数据集…

索尼ILCE-7SM3覆盖恢复案例

ILCE-7SM3算是索尼的流量级产品了&#xff0c;目前使用的比较多。今天我们来看一个格式化后又覆盖的恢复案例&#xff0c;看看这种情况下如何恢复残留的视频素材。 故障文件:80G SD卡 故障现象: 80G卡实际容量在74.5G左右&#xff0c;ExFat文件系统&#xff0c;格式化后又录…

Java8新特性-Stream

文章目录 简介Stream 的特性创建Stream通过集合创建流通过数组创建流通过Stream.of方法创建流创建规律的无限流创建无限流创建空流 Stream操作分类中间操作无状态filtermapflapMap 有状态distinctsortedreversedthenComparinglimitskipconcat 终结操作非短路操作forEachreducec…

D. Kilani and the Game(BFS模拟向四周漫延的过程)

Problem - D - Codeforces Kilani正在和他的朋友玩一个游戏。这个游戏可以表示为一个nm的网格&#xff0c;其中每个单元格都是空的或者被阻塞的&#xff0c;并且每个玩家在一些单元格中拥有一个或多个城堡&#xff08;一个单元格中没有两个城堡&#xff09;。 游戏分轮进行。每…

JS高级 -- 构造函数、数据常用函数

1. 深入对象 1.1 创建对象三种方式 利用对象字面量创建对象 const o {name:佩奇 }利用 new object 创建对象 const o new Object({ name:佩奇}) console.log(o) // {name: 佩奇}利用构造函数创建对象 1.2 构造函数 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要…

SpringBoot+Vue3实现登录验证码功能

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法Spring Cache的使用–快速上手篇分页查询–Java项目实战篇全局异常处理–Java实战项目篇 Java实现发送邮件&#xff08;定时自动发送邮件&#xff09;_java邮件通知_心态还需努力呀的博客-CSDN博客 该系列文章持续更新…

最高效的七个云原生开发原则

​Cloud native是一种软件开发方法&#xff0c;利用云基础架构实现更快、更可扩展的部署。云原生应用程序旨在充分利用现代化的工程实践&#xff0c;如自动化、托管服务和自动扩展控制。 这种模式对组织文化和工作实践也有影响。云技术应成为软件交付的重要组成部分。每个人都…