单例模式确保一个类只有一个实例,并提供一个全局访问点。
在 Java 中,实现单例模式有如下几种常见的方法。
饿汉式#
饿汉式在类加载时就创建实例,线程安全但可能会浪费内存。
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
// 私有化构造函数,防止外部实例化
private Singleton() {}
// 提供全局访问点
public static Singleton getInstance() {
return INSTANCE;
}
}
线程不安全的懒汉式#
懒汉式在第一次调用getInstance()
时创建实例,线程不安全。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
线程安全的懒汉式#
通过同步方法,确保多线程环境下也只有一个实例。
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
双重锁定检查#
在同步块内外都检查实例是否已创建,减少了同步开销。
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;
}
}
静态内部类#
使用静态内部类,线程安全且延迟加载。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
枚举#
最简单的一种实现方式,推荐使用。线程安全,支持序列化并且能够防止反射攻击。
public enum Singleton {
INSTANCE;
public void someMethod() {
// 实例方法
}
}