单例设计模式(Singleton Pattern)是一种创建型设计模式,确保一个类在整个应用程序生命周期中只有一个实例存在,并提供一个全局访问点。单例模式常用于需要全局控制的场景,如配置管理器、日志记录器、线程池等。
单例模式的实现方式
在Java中,有多种方式可以实现单例模式,下面介绍几种常见的方法:
1. 饿汉式(Eager Initialization)
饿汉式在类加载时就创建了单例实例,确保线程安全,但如果单例实例在应用程序中未被使用,会造成资源浪费。
实现代码:
public class Singleton {
// 在类加载时创建实例
private static final Singleton INSTANCE = new Singleton();
// 私有化构造方法,防止外部实例化
private Singleton() {}
// 提供全局访问点
public static Singleton getInstance() {
return INSTANCE;
}
}
2. 懒汉式(Lazy Initialization)
懒汉式在第一次使用时创建实例,实现了按需创建,但需要考虑多线程的同步问题。
实现代码:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. 线程安全的懒汉式(Synchronized 方法)
通过在getInstance方法上添加synchronized关键字,确保线程安全,但会带来性能开销。
实现代码:
public class Singleton {
private static Singleton instance;
private Singleton() {}
// 同步方法,保证线程安全
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
4. 双重检查锁(Double-Checked Locking)
结合懒加载和同步,减少同步开销,提高性能。需要将实例变量声明为volatile,确保可见性。
实现代码:
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;
}
}
5. 静态内部类(Initialization-on-demand Holder)
利用类加载机制实现延迟加载和线程安全,是推荐的单例实现方式。
实现代码:
public class Singleton {
// 私有构造方法
private Singleton() {}
// 静态内部类,持有Singleton实例
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
// 提供全局访问点
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
6. 枚举单例
使用枚举实现单例,是实现单例最简洁、最安全的方式,防止反序列化和反射攻击。
实现代码:
public enum Singleton {
INSTANCE;
// 可添加其他方法
public void someMethod() {
// 方法实现
}
}