Java单例模式的饿汉式与懒汉式实现比较

一颗跳动的心 2023-07-23 09:30:00 浏览数 (1674)
反馈

在Java中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。饿汉式和懒汉式是单例模式的两种实现方式。本文将详细介绍Java单例模式的饿汉式和懒汉式实现,并比较它们之间的优缺点。

饿汉式实现

 饿汉式是在类加载时就创建唯一实例,并在类内部进行实例化。它的实现非常简单,通过私有化构造方法和静态成员变量来确保只有一个实例。示例代码:

public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();

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

    public static EagerSingleton getInstance() {
        return instance;
    }
}

优点:

  • 线程安全:在类加载时就创建了实例,不需要考虑线程安全问题。
  • 简单明了:实现简单,代码易于理解。

缺点:

  • 立即加载:类加载时即创建实例,可能会浪费资源。
  • 不支持延迟加载:如果实例的创建过程较为耗时,可能会导致程序启动变慢。

懒汉式实现

懒汉式是在第一次使用时才进行实例化,实现了延迟加载的效果。在多线程环境下需要考虑线程安全问题。示例代码:

public class LazySingleton {
    private static LazySingleton instance;

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

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

优点:

  • 延迟加载:在第一次使用时才创建实例,节省了资源。
  • 线程安全:使用synchronized关键字确保线程安全。

缺点:

  • 性能影响:由于使用了synchronized,可能会导致性能下降,特别是在高并发环境下。
  • 可能存在重复创建实例:在多线程环境下,可能出现多个线程同时判断instance为空的情况,从而重复创建实例。

如何选择

如果希望在程序启动时就创建实例,并且没有性能要求,可以选择饿汉式实现。

如果希望延迟加载实例,并且要考虑线程安全问题,可以选择懒汉式实现。

结语

Java单例模式的饿汉式和懒汉式是常用的两种实现方式。饿汉式在类加载时就创建实例,线程安全且简单明了;懒汉式在第一次使用时才创建实例,具有延迟加载的特点,但需要考虑线程安全和性能问题。在实际开发中,根据需求和场景合理选择合适的实现方式,能够确保对象的唯一性和全局访问性。

 学java,就到java编程狮

0 人点赞