饿汉式
- 实现方式
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
- 优点
- 简单易懂,在类加载时就创建实例,保证了线程安全,因为类加载机制本身是线程安全的。
- 调用
getInstance
方法时直接返回实例,没有额外的同步开销。
- 缺点
- 类加载时就创建实例,如果该实例一直未被使用,会造成内存浪费。
双重检查锁(DCL)懒汉式
- 实现方式
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;
}
}
- 优点
- 实现了延迟加载,只有在第一次调用
getInstance
方法时才创建实例,避免了饿汉式可能出现的内存浪费问题。
- 采用双重检查锁机制,在保证线程安全的同时,减少了不必要的同步开销,提高了性能。
- 缺点
- 实现相对复杂,需要正确使用
volatile
关键字来防止指令重排导致的线程安全问题。如果volatile
关键字使用不当,可能会导致在某些情况下获取到未完全初始化的实例。