文章目录
【Java设计模式】懒加载模式
一、概述
Java中的懒加载设计模式将对象的初始化延迟到对象实际被需要的时候,从而最小化内存使用并减少启动时间。这种技术对于优化Java应用程序性能至关重要。
二、详细解释及实际示例
- 实际示例:
- Java中懒加载模式的一个现实世界类比是智能家庭中的灯光使用。当有人进入房子时,不是立即打开所有的灯,而是运动传感器检测并仅在使用的房间中打开灯。这反映了Java开发人员如何通过延迟对象创建来优化性能。
- 通俗解释:
- 懒加载模式延迟对象或资源的创建,直到实际需要它,从而优化内存使用并提高性能。
- 维基百科解释:
- 懒加载(也称为异步加载)是一种在计算机编程中使用的技术,特别是在Web设计和Web开发中,用于延迟对象的初始化,直到它被需要。如果正确和适当地使用,它可以有助于提高程序的运行效率。这使得它在访问网络内容和初始化时间应保持在最低限度的用例中非常理想,例如在网页的情况下。例如,延迟加载网页上的图像,直到查看它们时才需要,可以使网页的初始显示更快。懒加载的相反是急切加载。
三、Java中懒加载模式的编程示例
懒加载设计模式是一种性能优化技术,它延迟对象或昂贵计算的初始化,直到绝对必要。这种模式可以通过避免不必要的计算和减少内存使用来显著提高应用程序的性能。
在提供的代码中,我们可以在App
、HolderNaive
、HolderThreadSafe
和Java8Holder
类中看到懒加载模式的示例。
App
类是应用程序的入口点。它创建了HolderNaive
、HolderThreadSafe
和Java8Holder
的实例,并从它们中检索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);
}
}
HolderNaive
、HolderThreadSafe
和Java8Holder
类是懒加载模式的越来越复杂的实现。
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
类从HolderNaive
、HolderThreadSafe
和Java8Holder
中检索Heavy
对象。这些类延迟Heavy
对象的创建,直到实际需要它,展示了懒加载模式。
四、何时在Java中使用懒加载模式
当以下情况时使用懒加载:
- 对象的创建是资源密集型的,并且可能不总是被使用。
- 您需要延迟对象创建以优化内存使用或提高启动时间。
- 数据或资源的加载应该是即时的,而不是在应用程序启动时。
五、懒加载模式在Java中的实际应用
- Hibernate(Java ORM框架):延迟加载相关对象,直到它们被访问,利用懒加载模式来优化Java应用程序性能。
- JPA注解@OneToOne、@OneToMany、@ManyToOne、@ManyToMany和fetch = FetchType.LAZY
- Spring框架(依赖注入):仅在需要时加载bean,减少应用程序启动时间。
六、懒加载模式的好处和权衡
好处:
- 通过仅在需要时初始化对象来减少内存使用。
- 通过推迟昂贵的对象创建来提高应用程序启动性能。
权衡:
- 如果对象相互依赖,实现可能会很复杂。
- 如果初始化发生在意外的点,可能会导致延迟峰值的风险。