单例模式(Singleton Pattern)是一种常见的设计模式,它可以确保某个类只有一个实例,并提供对该实例的全局访问点。本文将详细介绍 Java 中所有单例模式实现,包括懒汉式、饿汉式、枚举式、双重检查锁定式、静态内部类式等。
懒汉式指的是在需要获取单例实例时才进行初始化。其特点是在第一次调用 getInstance()
方法时才创建单例对象,避免了预先占用系统资源。
懒汉式有两种常见的实现方式。第一种是线程不安全的实现方式,代码如下所示:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种实现方式线程不安全,多线程情况下可能会创建多个实例,因此需要进行线程安全处理。
第二种实现方式是在 getInstance()
方法上添加 synchronized
关键字来保证线程安全,代码如下所示:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种实现方式使用 synchronized
关键字来保证线程安全,在多线程情况下只会创建一个实例,但加锁会降低性能。
饿汉式指的是在类加载时就进行初始化,无论是否需要该实例。其特点是在程序启动时就创建单例对象,可以确保线程安全,但可能会占用较多的系统资源。
饿汉式的代码实现如下:
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
枚举式是 Java 中最简洁、最安全的单例实现方式。它通过枚举类型来实现单例,可以避免线程安全问题和反射攻击等问题。
枚举式的代码实现如下:
public enum Singleton {
INSTANCE;
public void doSomething() {
// ...
}
}
在枚举式中,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;
}
}
在双重检查锁定式中,第一次判断 instance
是否为 null
是为了避免不必要的同步,第二次判断是为了保证线程安全。使用 volatile
关键字可以确保多线程环境下的可见性。
静态内部类式是一种常用的懒汉式单例实现方式,它通过静态内部类来实现延迟加载和线程安全。
静态内部类式的代码实现如下:
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
在静态内部类式中,静态内部类 SingletonHolder
会在第一次使用时被加载,而 Singleton
类则是在调用 getInstance()
方法时才被加载,从而实现了延迟加载。由于静态内部类只会被加载一次,因此该实现方式也可以保证线程安全。
本文介绍了 Java 中所有常见的单例模式实现方式,包括懒汉式、饿汉式、枚举式、双重检查锁定式和静态内部类式。每种实现方式都有其优缺点和适用场景,大家需要根据实际情况进行选择。无论选择哪种实现方式,都应该遵循单一责任原则和开闭原则等设计原则,以确保代码具有良好的可维护性和扩展性。