单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下:
Ensure a class has only one instance, and provide a global point of access to it.(确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。)
在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反应”,可以采用单例模式,具体的场景如下:
实现单例模式的注意事项主要有:
getInstance()
方法并且尝试创建实例,可能会导致创建多个实例。在饿汉式单例模式中,单例对象在类加载时就已经被初始化,因此不需要担心线程安全问题。
public class EagerSingleton {
// 静态成员变量,保存单例对象(final 使对象具备不可变性,从而保证线程安全)
private static EagerSingleton instance = new EagerSingleton();
// 私有构造方法,防止外部实例化
private EagerSingleton() {}
// 公共静态方法,返回单例对象
public static EagerSingleton getInstance() {
return instance;
}
// 示例方法,用于演示单例的行为
public void doSomething() {
System.out.println("do something");
}
public static void main(String[] args) {
// 获取单例对象并调用方法
EagerSingleton eagerSingleton = EagerSingleton.getInstance();
eagerSingleton.doSomething();
}
}
getInstance
是一个公共静态方法,用于返回单例对象。由于 INSTANCE 已经在类加载时初始化,因此这种方法被称为“饿汉式”实现。
懒汉式单例模式的特点是在需要的时候才创建实例,将实例的初始化延迟到第一次调用的时候。
public class LazySingleton {
// 静态成员变量,保存单例对象
private static LazySingleton instance;
// 私有构造方法,防止外部实例化
private LazySingleton() {}
// 公共静态方法,返回单例对象
public static LazySingleton getInstance() {
// 双重检查加锁,线程安全
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance = new LazySingleton();
}
}
}
return instance;
}
// 示例方法,用于演示单例的行为
public void doSomething() {
System.out.println("Doing something...");
}
public static void main(String[] args) {
// 获取单例对象并调用方法
LazySingleton singleton = LazySingleton.getInstance();
singleton.doSomething();
}
}
getInstance()
是一个公共静态方法,用于返回单例对象。该方法利用双重检查锁保证线程安全:
《设计模式之禅 (第2版)》
Java基础面试题 | 小林coding (xiaolincoding.com)
手摸手实现基础组件模块 (yuque.com)