<aside>
💡
单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点
</aside>
- 单例模式让类负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法
- 单例模式因为Singleton类封装它的唯一实例,这样它可以严格地控制客户这样访问它以及何时访问它。简单地说就是对唯一实例的受控访问
结构图

- Singleton类定义一个GetInstance操作,允许客户端访问它的唯一实例
- GetInstance是一个静态方法,主要负责创建自己的唯一实例,该方法时获得本类实例的唯一全局访问点
单例模式的基本要求
- 私有的构造函数:防止外部代码直接创建类的实例
- 私有的静态实例变量:保存该类的唯一实例
- 公有的静态方法:通过公有的静态方法来获取类的实例
多线程时的单例
多线程时,需要对创建实例的过程上锁
- 保证对象实例由最先进入的那个线程创建,以后的线程在进入时不会再去创建对象实例
双重锁定

- 双重锁定(Double-Check Locking):不用让线程每次都上锁,而只是在实例未被创建时再加锁处理。提高了性能,也保证了多线程的安全
- 为什么需要判断两次
instance == null
?
- 可能有多个线程通过第一个判断在lock的临界区等待
- 此时只有第一个进入临界区的线程能创建实例
饿汉式单例类和懒汉式单例类
- 饿汉式
- 指在类加载时就已经完成了实例的创建,不管后面创建的实例有没有使用,先创建再说,所以叫做 “饿汉”。
- 饿汉式需要提前占用系统资源
- 懒汉式
- 指只有在请求实例时才会创建,如果在首次请求时还没有创建,就创建一个新的实例,如果已经创建,就返回已有的实例,意思就是需要使用了再创建,所以称为“懒汉”。
- 懒汉式面临多线程访问的安全性问题,需要做双重锁定这样的处理保证安全性