- 目的 : 确保一个类只有一个实例,并提供全局访问点。
- 核心 : 私有化构造函数,提供静态方法获取唯一实例。
- 场景 : 全局配置(如数据库连接、系统参数),全局共享的缓存实例(如 Redis 客户端、内存缓存)
java
public class Singleton {
private static volatile Singleton instance; // volatile 防止指令重排序,保证拿到的是完整对象
private Singleton(){ }
public static Singleton getSingleton() {
if(instance == null){ // 第一次检查(非同步,提高性能) 点菜,第一次叫服务员,服务员先看看有没有订单
synchronized (Singleton.class) { // 同步块 获得 Singleton.class 这个类对象的锁 一个包间里面只能进一个服务员
if(instance == null){ // 第二次检查(防止重复创建) 服务员A、B都看见订单是空的,同时来到包间前。A获得锁进入包间,
instance = new Singleton(); // 通过第二次检查成功下单,然后释放锁走出包间。此时B才获得锁进入包间,检查到A已经下单,所以直接返回创建好的订单。
}
}
}
return instance;
};
}

这是单例模式的类图

各种符号代表的意思
+ Public(公有)
- Private(私有)
# Protected(受保护)
~ Package(包内/默认)