设计模式 单例
基于上方的视频的学习笔记
1.定义
简单来说 就是一个类的构造函数必须是私有的(private)
然后这个类提供一个公开的静态方法 public static 在方法里调用类的构造函数实例化对象
最后这个类存在一个类变量(静态变量 static修饰)
主要作用:确保一个类只有一个实例存在
常见场景:序列号生成器、web页面的计数器、某些消耗许多资源的场景(访问IO或者数据库的资源)
2.细分
饿汉式、懒汉式
2.1 饿汉式
这个唯一的实例,在类进行加载时立刻进行实例化
2.2 懒汉式
这个唯一的实例,在类加载的时候不进行实例化,在第一次使用时再进行实例化
①由于被使用时才实例化,所以还得加上锁,防止并发运行时被重复执行
②由于不是类加载时就执行,所以会在程序运行过程中被反复执行,必须加if判断
2.3 懒汉式 - 双重检查锁
可以发现上面的懒汉式会在程序运行过程中被反复执行,但是我们知道一旦类被实例化,if判断就肯定不为空,而自动锁会导致每个线程运行这个方法时都要排队,导致整体效率低下。
而锁是不能丢的,所以锁要缩小范围,只锁住实例化对象的代码,外部的if判断不锁。
①将自动锁范围缩小到if语句内,只锁住实例化对象的代码
②使用双重检查锁进行初始化的实例必须使用Volatile关键字修饰
Volatile修饰的原因:
3.单例模式的缺点
只有一个实例化对象,会随时被修改,所以为了避免这种风险,单例模式创建的对象一般要求是无状态的——即通常是工具类