当前位置: 技术文章>> 100道Java面试题之-什么是Java中的单例模式?请实现一个懒汉式和饿汉式的单例模式。

文章标题:100道Java面试题之-什么是Java中的单例模式?请实现一个懒汉式和饿汉式的单例模式。
  • 文章分类: 后端
  • 3452 阅读

什么是Java中的单例模式?

单例模式(Singleton Pattern)是一种常用的软件设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来获取该实例。单例模式的主要目的是控制资源的使用,确保资源被全局唯一访问。

懒汉式单例模式

懒汉式单例模式在第一次被使用时才实例化对象,因此实现了延迟加载。但需要注意的是,在多线程环境下可能会产生多个实例,因此通常需要通过加锁来确保线程安全。

public class LazySingleton {
    // 私有静态变量,类内部初始化,默认值为null
    private static LazySingleton instance = null;

    // 私有构造方法,防止外部通过new创建对象
    private LazySingleton() {}

    // 提供一个全局的静态方法,返回唯一实例,使用synchronized关键字保证线程安全
    public static synchronized LazySingleton getInstance() {
        if (instance == null) {
            instance = new LazySingleton();
        }
        return instance;
    }
}

饿汉式单例模式

饿汉式单例模式在类加载时就完成了初始化,所以类加载较慢,但获取对象的速度快。它是线程安全的,因为JVM在加载类时只会创建一次instance实例。

public class HungrySingleton {
    // 私有静态变量,类内部初始化
    private static final HungrySingleton instance = new HungrySingleton();

    // 私有构造方法,防止外部通过new创建对象
    private HungrySingleton() {}

    // 提供一个全局的静态方法,返回唯一实例
    public static HungrySingleton getInstance() {
        return instance;
    }
}

注意点

  • 线程安全:懒汉式单例模式在多线程环境下需要加锁来确保线程安全,但加锁会影响性能。而饿汉式单例模式则是线程安全的,因为JVM保证了类加载的唯一性。
  • 性能问题:饿汉式单例模式在类加载时就完成了初始化,如果单例对象很大或者初始化很复杂,那么会影响应用的启动性能。而懒汉式单例模式则实现了延迟加载,但是加锁操作会影响性能。
  • 双重检查锁定(Double-Checked Locking):是一种优化懒汉式单例模式的方法,通过在instance变量上加上volatile关键字来禁止指令重排序,并通过双重检查来减少锁的开销,但实现起来相对复杂。

总结

单例模式是一种常见的设计模式,用于控制资源的使用,确保全局只有一个实例。懒汉式和饿汉式是单例模式的两种常见实现方式,各有优缺点,应根据具体应用场景选择适合的实现方式。

推荐文章