单例模式(Singleton Pattern)
1. 概述
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于需要确保全局只有一个实例的场景,比如配置管理器、日志记录器等。
2. 适用场景
- 系统中只需要一个实例来提供某项服务,如配置管理、日志记录、数据库连接池等。
- 需要控制实例的创建过程,防止多个实例带来的资源浪费或冲突。
3. 实现方式
单例模式的实现方式主要有以下几种:
- 懒汉式(Lazy Initialization):实例在第一次使用时创建。
- 饿汉式(Eager Initialization):类加载时就创建实例,线程安全。
- 双重检查锁(Double-Check Locking):懒汉式的线程安全实现,减少同步开销。
- 静态内部类(Bill Pugh Singleton Design):使用静态内部类来实现线程安全的单例模式。
- 枚举方式:使用枚举来实现单例,保证唯一性和线程安全。
4. 示例代码
1. 懒汉式(线程不安全)
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
2. 懒汉式(线程安全)
public class Singleton {
private static Singleton instance;
private Singleton() {}
public synchronized static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
3. 双重检查锁
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;
}
}
4. 静态内部类(推荐)
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
5. 枚举方式(推荐)
public enum Singleton {
INSTANCE;
// 可以定义其他方法
public void doSomething() {
System.out.println("Singleton instance method");
}
}
5. 分析
- 懒汉式(线程不安全):简单实现,但在多线程环境下可能会出现问题。
- 懒汉式(线程安全):使用
synchronized
关键字来确保线程安全,但可能会影响性能。 - 双重检查锁:在保证线程安全的同时,减少了同步开销,性能较好。
- 静态内部类:利用类加载机制实现延迟初始化,并且线程安全,推荐使用。
- 枚举方式:实现最简单,线程安全,避免了序列化带来的问题,推荐使用。