java如何延迟加载
延迟加载的实现方法
在Java中,延迟加载(Lazy Loading)是一种优化技术,用于推迟对象的初始化或资源的加载,直到真正需要时才执行。以下是几种常见的实现方式:
使用Supplier接口(Java 8及以上)
Supplier接口可以用于延迟计算或加载对象。通过Supplier.get()方法触发实际加载:

Supplier<ExpensiveObject> lazySupplier = () -> {
ExpensiveObject obj = new ExpensiveObject();
// 初始化操作
return obj;
};
// 实际使用时才加载
ExpensiveObject obj = lazySupplier.get();
双重检查锁定(Double-Checked Locking)
适用于需要线程安全的单例延迟加载场景:
public class LazySingleton {
private volatile static ExpensiveObject instance;
public static ExpensiveObject getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new ExpensiveObject();
}
}
}
return instance;
}
}
静态内部类(Holder模式)
利用类加载机制实现线程安全的延迟加载:

public class HolderPattern {
private static class Holder {
static final ExpensiveObject INSTANCE = new ExpensiveObject();
}
public static ExpensiveObject getInstance() {
return Holder.INSTANCE;
}
}
Hibernate/JPA中的延迟加载
ORM框架通过代理对象实现关联对象的延迟加载:
@Entity
public class Order {
@OneToMany(fetch = FetchType.LAZY)
private List<OrderItem> items;
// 访问items时才会触发数据库查询
}
自定义延迟加载包装类
通过包装类控制加载时机:
public class LazyLoader<T> {
private T value;
private Supplier<T> supplier;
public LazyLoader(Supplier<T> supplier) {
this.supplier = supplier;
}
public T get() {
if (value == null) {
value = supplier.get();
}
return value;
}
}
注意事项
- 线程安全:多线程环境下需考虑同步问题
- 空值处理:延迟加载可能返回null,需做好防御性编程
- 性能权衡:延迟加载会增加第一次访问的开销
选择具体实现方式时,应根据应用场景、线程安全需求和性能要求综合考虑。






