单例模式确保一个类仅有一个实例并提供全局访问点。饿汉式在类加载时创建实例,线程安全但不支持懒加载;懒汉式通过synchronized实现线程安全的延迟加载,但性能较差;双重检查锁通过volatile和同步块结合,既保证线程安全又提升性能,推荐使用;静态内部类利用类加载机制实现懒加载和线程安全,也是推荐方式。两种推荐方式均避免了不必要的同步开销,且能正确处理多线程环境下的实例唯一性。构造方法必须私有化以防止外部实例化,这是实现单例的关键细节。

单例模式确保一个类只有一个实例,并提供全局访问点。在Java中,有多种实现方式,每种都有其适用场景和优缺点。
饿汉式(静态常量)
类加载时就创建实例,线程安全,但不管是否使用都会创建对象。
public class Singleton {private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
懒汉式(线程安全)
延迟加载,在第一次调用时才创建实例。通过synchronized保证线程安全,但性能较低。
public class Singleton {private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
双重检查锁(推荐)
既保证延迟加载,又提高性能,只在必要时加锁。需使用volatile防止指令重排。
立即学习“Java免费学习笔记(深入)”;
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时才会加载内部类。
public class Singleton {private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
基本上就这些常见写法。双重检查锁和静态内部类是实际开发中最常用的,兼顾了性能与安全。注意构造方法必须私有,避免外部new对象。不复杂但容易忽略细节。










