在 Java 中实现单例模式有多种方式,下面将介绍五种常见的实现方式,并提供相应的步骤流程和示例代码。
在类加载时就创建实例,保证线程安全。适用于实例创建开销较小的情况。
步骤流程:
示例代码:
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {
// 私有构造方法
}
public static EagerSingleton getInstance() {
return instance;
}
}
延迟加载实例,直到首次访问时创建。需要注意线程安全性问题。
步骤流程:
示例代码:
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
// 私有构造方法
}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
结合懒汉式和同步锁,提高性能。需要考虑指令重排问题。
步骤流程:
示例代码:
public class DoubleCheckedSingleton {
private static volatile DoubleCheckedSingleton instance;
private DoubleCheckedSingleton() {
// 私有构造方法
}
public static DoubleCheckedSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedSingleton();
}
}
}
return instance;
}
}
利用类加载机制和静态内部类的特性,实现懒加载和线程安全。
步骤流程:
示例代码:
public class StaticInnerSingleton {
private StaticInnerSingleton() {
// 私有构造方法
}
private static class SingletonHolder {
private static final StaticInnerSingleton instance = new StaticInnerSingleton();
}
public static StaticInnerSingleton getInstance() {
return SingletonHolder.instance;
}
}
枚举实现的单例模式是线程安全的,并且可以防止反序列化和反射攻击。
步骤流程:
创建一个单例枚举,枚举元素即为单例实例。
示例代码:
public enum EnumSingleton {
INSTANCE;
// 添加其他方法和成员变量
}
这里列举的是常见的几种单例模式的实现方式。注意在实际开发中,选择适合场景和性能要求的方式很重要。
对于 Maven 和 Gradle 的依赖,以上示例代码不需要依赖任何第三方库,因此不需要特定的依赖坐标。