MST

星途 面试题库

面试题:Java中实现线程安全单例模式的常见方式

请简述在Java中实现线程安全单例模式的两种常见方式,并分析它们的优缺点。
16.7万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

饿汉式

  1. 实现方式
public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return INSTANCE;
    }
}
  1. 优点
    • 简单易懂,在类加载时就创建实例,保证了线程安全,因为类加载机制本身是线程安全的。
    • 调用getInstance方法时直接返回实例,没有额外的同步开销。
  2. 缺点
    • 类加载时就创建实例,如果该实例一直未被使用,会造成内存浪费。

双重检查锁(DCL)懒汉式

  1. 实现方式
public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
  1. 优点
    • 实现了延迟加载,只有在第一次调用getInstance方法时才创建实例,避免了饿汉式可能出现的内存浪费问题。
    • 采用双重检查锁机制,在保证线程安全的同时,减少了不必要的同步开销,提高了性能。
  2. 缺点
    • 实现相对复杂,需要正确使用volatile关键字来防止指令重排导致的线程安全问题。如果volatile关键字使用不当,可能会导致在某些情况下获取到未完全初始化的实例。