定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
class Singleton {
// 私有静态常量,类加载时就实例化唯一的 HungrySingleton 对象
private static final Singleton instance = new Singleton();
// 私有构造函数,防止外部创建新的实例
private Singleton() {}
// 公共静态方法,提供全局访问唯一实例
public static Singleton getInstance() {
return instance; // 返回唯一的实例
}
}
public class Singleton {
// 私有静态变量,用于存储 Singleton 类的唯一实例
private static Singleton instance;
// 私有构造函数,防止外部类直接创建实例
private Singleton (){}
// 公共静态同步方法,用于获取 Singleton 实例
public static synchronized Singleton getInstance() {
// 如果实例为 null,说明尚未创建实例
if (instance == null) {
// 创建新的 Singleton 实例
instance = new Singleton();
}
// 返回已存在或刚创建的唯一实例
return instance;
}
}
注:synchronized关键字用于多线程编程。主要作用为:确保在多线程环境中,同一时间只有一个线程可以被synchronized修饰的方法或者代码块执行。类似同步互斥。
// 定义一个公共类 Singleton
public class Singleton {
// 使用 volatile 关键字修饰的私有静态变量 singleton,确保在多线程环境下的可见性
private volatile static Singleton singleton;
// 私有构造函数,防止外部直接实例化该类
private Singleton (){}
// 公共静态方法,用于获取 Singleton 实例
public static Singleton getSingleton() {
// 首先检查 singleton 是否为 null
if (singleton == null) {
// 如果为 null,则进入同步块进行加锁
synchronized (Singleton.class) {
// 再次检查 singleton 是否为 null
if (singleton == null) {
// 如果仍然为 null,则创建实例
singleton = new Singleton();
}
}
}
// 返回唯一实例 singleton
return singleton;
}
}
注:volatile 关键字表示这个变量可能会被多个线程同时访问,确保对该变量的读取和写入不会被缓存,而是直接从主内存中获取。
菜鸟想法:单例模式就像是整个世界只有一个宝贝东西,大家都要用这个东西,但是不能有第二个。实现单例模式一般有如下几个步骤:
- 构造方法私有化(private):防止其他代码直接创建该类的实例,只能通过指定的方法来获取实例
- 静态变量:用来存储唯一实例
- 公共方法:提供一个获得实例的公共方法,确保第一次调用时创建实例,之后的调用返回已经创建的实例
而饿汉式单例就是在创建静态变量(静态初始化)的时候就将自己实例化,如:private static Singleton instance = new Singleton();