单例模式之饿汉模式和懒汉模式区别以及案例代码

饿汉模式和懒汉模式都是单例模式的实现方式,它们有以下区别:

  1. 饿汉模式(Eager Initialization):
    • 在类加载时就创建唯一实例对象。
    • 在类的静态初始化阶段完成实例化,因此线程安全。
    • 实现简单直观,但无法实现延迟加载。
    • 一般适用于实例化耗费资源较少且提前被使用的情况。
  2. 懒汉模式(Lazy Initialization):
    • 延迟创建唯一实例对象,直到第一次使用时才进行实例化。
    • 在多线程环境中需要特殊处理,以保证线程安全。
    • 实现相对复杂,但能够实现延迟加载。
    • 适用于实例化耗费资源较多或者不一定被使用的情况。

下面分别给出饿汉模式和懒汉模式的示例代码:

饿汉模式示例代码:

public class EagerSingleton {
    // 私有静态变量,在类加载时就创建唯一实例对象
    private static EagerSingleton instance = new EagerSingleton();

    // 私有构造方法,防止外部实例化
    private EagerSingleton() {
    }

    // 公共静态方法,获取唯一实例对象
    public static EagerSingleton getInstance() {
        return instance;
    }

    // 其他方法
    public void showMessage() {
        System.out.println("Hello, World!");
    }
}

懒汉模式示例代码:

public class LazySingleton {
    // 私有静态变量,保存唯一实例对象
    private static LazySingleton instance;

    // 私有构造方法,防止外部实例化
    private LazySingleton() {
    }

    // 公共静态方法,获取唯一实例对象,通过双重检查锁定实现线程安全
    public static LazySingleton getInstance() {
        if (instance == null) {
            synchronized (LazySingleton.class) {
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }

    // 其他方法
    public void showMessage() {
        System.out.println("Hello, World!");
    }
}

在使用时,可以通过以下方式获取单例实例:

EagerSingleton eagerSingleton = EagerSingleton.getInstance();
eagerSingleton.showMessage(); // 输出:Hello, World!

LazySingleton lazySingleton = LazySingleton.getInstance();
lazySingleton.showMessage(); // 输出:Hello, World!

需要注意的是,懒汉模式使用双重检查锁定来保证线程安全。这种实现方式需要考虑到多线程环境下的竞态条件和内存可见性等问题,以确保只有一个实例对象被创建。

© 版权声明
THE END
喜欢就支持一下吧
点赞10赞赏 分享