饿汉模式在类加载时创建实例,由JVM保证线程安全,实现简单但可能浪费资源;2. 懒汉模式在首次调用getInstance时创建,支持延迟加载,节省内存,但需通过volatile和双重检查锁定确保线程安全;3. 两者主要区别在于实例化时机、资源利用、线程安全和性能,选择取决于是否需要延迟加载及对性能与安全的要求。

懒汉模式和饿汉模式是Java中实现单例模式的两种常见方式,它们的核心区别在于实例化时机和线程安全性。
饿汉模式(Eager Initialization)
饿汉模式在类加载时就创建实例,不管是否会被使用。
- 实例在类加载阶段就完成初始化,由JVM保证线程安全。
- 实现简单,没有多线程同步问题。
- 缺点是可能造成资源浪费,如果该实例一直没被使用,也会被创建。
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
懒汉模式(Lazy Initialization)
懒汉模式在第一次调用getInstance()方法时才创建实例。
- 延迟加载,节省内存,只有在需要时才创建对象。
- 普通写法存在线程安全问题,多个线程同时调用getInstance()可能生成多个实例。
- 可通过加锁(如synchronized)解决线程安全,但会影响性能。
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
主要区别总结
- 创建时间:饿汉在类加载时创建,懒汉在首次使用时创建。
- 资源利用:饿汉可能浪费资源,懒汉更节省内存。
- 线程安全:饿汉天然线程安全,懒汉需额外处理才能保证安全。
- 性能:饿汉获取实例快,懒汉首次获取稍慢(尤其加锁后)。











