java懒汉和饿汉模式的区别

饿汉模式在类加载时创建实例,由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; } }

主要区别总结

  • 创建时间:饿汉在类加载时创建,懒汉在首次使用时创建。
  • 资源利用:饿汉可能浪费资源,懒汉更节省内存。
  • 线程安全:饿汉天然线程安全,懒汉需额外处理才能保证安全。
  • 性能:饿汉获取实例快,懒汉首次获取稍慢(尤其加锁后)。
基本上就这些。选择哪种方式取决于是否需要延迟加载以及对性能和安全的要求。