Java单例模式懒汉和饿汉

原创admin 分类:热门问答 0

Java单例模式懒汉和饿汉

单例模式是软件工程中常用的设计模式之一,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在控制资源分配、数据库连接管理、日志记录等场景中非常有用。在Java中,实现单例模式的两种常见方式是懒汉式和饿汉式。本文将深入探讨这两种模式的定义、实现、区别与使用场景,并提供相应的代码案例。

定义与目的

单例模式的核心在于确保唯一性全局访问。它通过限制类的构造函数访问,防止外部直接创建实例,并提供一个静态方法来获取类的唯一实例。这样做的目的是为了节省资源,提高效率,同时保证数据的一致性和可管理性。

懒汉式与饿汉式的区别

懒汉式

  • 实例化时机:只有在第一次调用获取实例的方法时才创建对象。
  • 线程安全性:需要考虑多线程环境下的同步问题。
  • 资源利用:按需创建,节省初期资源,但可能在获取实例时有性能损耗。

饿汉式

  • 实例化时机:在类加载时就完成实例化。
  • 线程安全性:天生线程安全,无需额外同步措施。
  • 资源利用:无论是否使用,都会占用资源,可能导致内存浪费。

核心类与方法

懒汉式

public class LazySingleton {
    private static LazySingleton instance;

    private LazySingleton() {}

    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}
  • 核心方法getInstance(),它在第一次调用时检查实例是否存在,不存在则创建,并加锁保证线程安全。

饿汉式

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

    private HungrySingleton() {}

    public static HungrySingleton getInstance() {
        return instance;
    }
}
  • 核心类HungrySingleton,它在类加载时就创建了唯一实例,并通过getInstance()方法提供全局访问。

使用场景

懒汉式适用场景

  • 资源消耗较大的对象。
  • 只在真正需要时才创建实例。
  • 适用于多线程环境,但需要注意线程安全问题。

饿汉式适用场景

  • 对象创建成本低,或者不关心资源消耗。
  • 适用于单线程环境或对性能要求不高的场景。

代码案例

懒汉式代码案例

public class LazySingletonDemo {
    public static void main(String[] args) {
        LazySingleton singleton1 = LazySingleton.getInstance();
        LazySingleton singleton2 = LazySingleton.getInstance();
        System.out.println(singleton1 == singleton2); // true
    }
}

饿汉式代码案例

public class HungrySingletonDemo {
    public static void main(String[] args) {
        HungrySingleton instance1 = HungrySingleton.getInstance();
        HungrySingleton instance2 = HungrySingleton.getInstance();
        System.out.println(instance1 == instance2); // true
    }
}

对比表格

特性 懒汉式 饿汉式
实例化时机 延迟至首次使用 类加载时立即
线程安全性 需要手动实现 原生支持
资源利用 按需分配,节省初期资源 始终占用资源,可能浪费
性能 首次调用有延迟 调用速度快
适用场景 多线程环境,资源消耗大 单线程或资源消耗小的环境

通过上述对比,我们可以看到懒汉式和饿汉式单例模式各有优势和适用场景。开发者应根据实际情况选择合适的实现方式。在实际开发中,单例模式的应用非常广泛,它不仅能够简化对象的创建和管理,还能提高系统的性能和稳定性。

相关文章

猜你喜欢

领取相关Java架构师视频资料

网络安全学习平台视频资料