c语言编程笔录

首页 >   > 笔记大全

笔记大全

java懒汉和饿汉模式的区别有哪些

更新时间:2023-10-12

懒汉模式和饿汉模式的介绍

懒汉模式和饿汉模式是两种常见的单例模式实现方式,单例模式用于保证一个类只有一个实例,并提供一个全局访问点。这种模式在实际应用中经常使用,比如数据库连接池、线程池、缓存、日志处理等。

懒汉模式的特点

懒汉模式是在需要获取实例时才创建对象,即在第一次调用getInstance方法时才创建实例。懒汉模式的核心思想是延迟加载,只有需要时才进行实例化,可以节省系统资源。

懒汉模式的代码实现比较简单,通常可以使用以下方式:

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 EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();
    
    private EagerSingleton() {}
    
    public static EagerSingleton getInstance() {
        return instance;
    }
}

饿汉模式在多线程环境下可以正常工作,因为实例的创建是在类加载时完成的,不存在多线程竞争的问题。但如果实例很大且在初始化时消耗较多资源,可能会导致系统启动缓慢。

懒汉模式和饿汉模式的区别

1. 创建时机不同:懒汉模式是在需要时才创建实例,饿汉模式是在类加载时就创建实例。

2. 多线程安全性:懒汉模式需要处理多线程并发访问的问题,可以通过加锁等方式保证线程安全;饿汉模式不存在多线程竞争的问题,因为实例的创建在类加载时就已经完成。

3. 资源消耗:懒汉模式可以延迟加载,只有在需要时才进行实例化,节省了系统资源;饿汉模式会在类加载时创建实例,不管是否被使用,可能会占用一定的资源。

4. 线程安全和资源消耗的权衡:懒汉模式在处理多线程安全性时会引入额外的开销,但可以节省系统资源;饿汉模式在多线程环境下不需要考虑线程安全问题,但可能会存在资源的浪费。

总而言之,懒汉模式和饿汉模式都有各自的适用场景。懒汉模式适用于需要延迟加载和节约资源的情况,但需要考虑多线程并发访问的安全问题;饿汉模式适用于实例创建较小且消耗资源较少的情况,不需要考虑多线程安全性问题。