MST
星途 面试题库

面试题:Java单例模式不同优化策略在不同应用场景的适用性

假设有一个高并发的系统,其中一部分模块需要频繁获取单例对象,另一部分模块对单例对象的获取频率较低但对启动性能要求较高。请详细说明如何根据这些需求,在Java中选择合适的单例模式优化策略,并解释原因。
38.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 选择饿汉式单例模式

  • 实现方式:在类加载时就创建单例实例,代码如下:
public class EagerSingleton {
    private static final EagerSingleton instance = new EagerSingleton();
    private EagerSingleton() {}
    public static EagerSingleton getInstance() {
        return instance;
    }
}
  • 适用场景及原因:适用于对启动性能要求较高且获取频率较低的模块。因为类加载机制保证了实例的唯一性,且在类加载时就创建实例,无需额外的同步操作,所以启动速度快。在高并发环境下,饿汉式单例模式天然支持多线程安全,无需担心同步问题。

2. 选择双重检查锁定(DCL)单例模式

  • 实现方式
public class DoubleCheckedLockingSingleton {
    private volatile static DoubleCheckedLockingSingleton instance;
    private DoubleCheckedLockingSingleton() {}
    public static DoubleCheckedLockingSingleton getInstance() {
        if (instance == null) {
            synchronized (DoubleCheckedLockingSingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckedLockingSingleton();
                }
            }
        }
        return instance;
    }
}
  • 适用场景及原因:适用于频繁获取单例对象的模块。volatile关键字确保了实例在多线程环境下的可见性和禁止指令重排序,避免了在高并发场景下可能出现的空指针异常。双重检查机制减少了不必要的同步开销,在第一次检查instance == null时,如果实例已存在,就无需进入同步块,提高了获取单例的效率。