【Java设计模式】懒加载模式

【Java设计模式】懒加载模式

一、概述

Java中的懒加载设计模式将对象的初始化延迟到对象实际被需要的时候,从而最小化内存使用并减少启动时间。这种技术对于优化Java应用程序性能至关重要。

二、详细解释及实际示例

  1. 实际示例
    • Java中懒加载模式的一个现实世界类比是智能家庭中的灯光使用。当有人进入房子时,不是立即打开所有的灯,而是运动传感器检测并仅在使用的房间中打开灯。这反映了Java开发人员如何通过延迟对象创建来优化性能。
  2. 通俗解释
    • 懒加载模式延迟对象或资源的创建,直到实际需要它,从而优化内存使用并提高性能。
  3. 维基百科解释
    • 懒加载(也称为异步加载)是一种在计算机编程中使用的技术,特别是在Web设计和Web开发中,用于延迟对象的初始化,直到它被需要。如果正确和适当地使用,它可以有助于提高程序的运行效率。这使得它在访问网络内容和初始化时间应保持在最低限度的用例中非常理想,例如在网页的情况下。例如,延迟加载网页上的图像,直到查看它们时才需要,可以使网页的初始显示更快。懒加载的相反是急切加载。

三、Java中懒加载模式的编程示例

懒加载设计模式是一种性能优化技术,它延迟对象或昂贵计算的初始化,直到绝对必要。这种模式可以通过避免不必要的计算和减少内存使用来显著提高应用程序的性能。
在提供的代码中,我们可以在AppHolderNaiveHolderThreadSafeJava8Holder类中看到懒加载模式的示例。
App类是应用程序的入口点。它创建了HolderNaiveHolderThreadSafeJava8Holder的实例,并从它们中检索Heavy对象。

@Slf4j
public class App {
    public static void main(String[] args) {
        var holderNaive = new HolderNaive();
        var heavy = holderNaive.getHeavy();
        LOGGER.info("heavy={}", heavy);
        var holderThreadSafe = new HolderThreadSafe();
        var another = holderThreadSafe.getHeavy();
        LOGGER.info("another={}", another);
        var java8Holder = new Java8Holder();
        var next = java8Holder.getHeavy();
        LOGGER.info("next={}", next);
    }
}

HolderNaiveHolderThreadSafeJava8Holder类是懒加载模式的越来越复杂的实现。
HolderNaive类是一个简单的、非线程安全的模式实现。

public class HolderNaive {
    private Heavy heavy;
    public HolderNaive() {
        LOGGER.info("HolderNaive创建");
    }
    public Heavy getHeavy() {
        if (heavy == null) {
            heavy = new Heavy();
        }
        return heavy;
    }
}

HolderThreadSafe类是一个线程安全的模式实现,但每次访问时都有繁重的同步。

public class HolderThreadSafe {
    private Heavy heavy;
    public synchronized Heavy getHeavy() {
        if (heavy == null) {
            heavy = new Heavy();
        }
        return heavy;
    }
}

Java8Holder类是该模式最有效的实现,利用了Java 8的特性。

public class Java8Holder {
    private Supplier<Heavy> heavy = this::createAndCacheHeavy;
    public Java8Holder() {
        LOGGER.info("Java8Holder创建");
    }
    public Heavy getHeavy() {
        return heavy.get();
    }
    private synchronized Heavy createAndCacheHeavy() {
        class HeavyFactory implements Supplier<Heavy> {
            private final Heavy heavyInstance = new Heavy();
            public Heavy get() {
                return heavyInstance;
            }
        }
        if (!(heavy instanceof HeavyFactory)) {
            heavy = new HeavyFactory();
        }
        return heavy.get();
    }
}

在这个示例中,App类从HolderNaiveHolderThreadSafeJava8Holder中检索Heavy对象。这些类延迟Heavy对象的创建,直到实际需要它,展示了懒加载模式。

四、何时在Java中使用懒加载模式

当以下情况时使用懒加载:

  1. 对象的创建是资源密集型的,并且可能不总是被使用。
  2. 您需要延迟对象创建以优化内存使用或提高启动时间。
  3. 数据或资源的加载应该是即时的,而不是在应用程序启动时。

五、懒加载模式在Java中的实际应用

  1. Hibernate(Java ORM框架):延迟加载相关对象,直到它们被访问,利用懒加载模式来优化Java应用程序性能。
  2. JPA注解@OneToOne、@OneToMany、@ManyToOne、@ManyToMany和fetch = FetchType.LAZY
  3. Spring框架(依赖注入):仅在需要时加载bean,减少应用程序启动时间。

六、懒加载模式的好处和权衡

好处:

  1. 通过仅在需要时初始化对象来减少内存使用。
  2. 通过推迟昂贵的对象创建来提高应用程序启动性能。

权衡:

  1. 如果对象相互依赖,实现可能会很复杂。
  2. 如果初始化发生在意外的点,可能会导致延迟峰值的风险。

七、源码下载

懒加载模式示例代码下载

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值