1.什么是单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。
注意:
- 1、单例类只能有一个实例。
- 2、单例类必须自己创建自己的唯一实例。
- 3、单例类必须给所有其他对象提供这一实例
2.单例模式怎么实现
2.1 饿汉模式
饿汉模式 顾名思义 就是非常急切 所以它在类加载过程中就会生成实例



同时 构造方法中也可根据需要进行传参。
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
饿汉式在类加载时就创建实例,因此线程安全,但可能会浪费内存
2.2 懒汉模式
懒汉是 尽可能晚的去创建实例 延迟创建
就比如看小说一样是加载下一页时候创建下一页 而不是上来就全部加载 那样太浪费空间


public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
单例模式的创建不只有两种模式 其他的不常用不过多涉及
3.单例模式下的线程安全
饿汉式在类加载时就创建实例,因此线程安全,但可能会浪费内存
懒汉式在需要时才创建实例,但需要加锁以确保线程安全

由此看出我们懒汉模式是不安全 的
因此我们不难想到使用加锁的方式来使得线程安全

但是如果每次运行都要加锁那将大大降低运行效率
因此我们做一下优化



在单线程中 1 2 3还是1 3 2 都是无关紧要的 但是当在多线程中 这就会成为bug
因此我们可以借助volatile 来解决内存可见性问题

volatile 的功能有两方面
1.确保每次读取操作 都在读内存
2.关于该变量的读取 修改操作不会触发重排序

4.单例模式的优缺点
优点:
-
内存节省:在内存中只有一个实例,减少了内存开销。
-
资源管理:避免对资源的多重占用,如文件操作。
缺点:
-
不易扩展:没有接口,不能继承。
-
与单一职责原则冲突:一个类应该只关心内部逻辑,而不关心实例化方式。
5.使用场景
单例模式适用于以下场景:
-
唯一序列号生成。
-
全局计数器。
-
资源消耗大的对象,如数据库连接。