定义:一个类只有一个实例
构造方法私有,提供一个静态的成员变量,提供公共静态方法访问
分类
饿汉式:一开始就生成实例
懒汉式:需要时才生成实例
实现方式:
饿汉式
枚举饿汉式
懒汉式
双检锁懒汉式
静态内部类懒汉式
破坏单例:反射破坏单例、反序列化破坏单例(单例实现了序列化接口)、Unsafe破坏单例
反射破坏原理:获取单例的类名,用反射机制强行访问构造方法,生成新的对象。
防止反射破坏:在构造方法中判断是否已经生成实例,如有则抛出异常。
反序列化破坏:

防止:写一个特殊方法 readResolve
public Object readResolve(){
//返回本来已有的实例
return INSTANCE;
}
枚举类单例可以防止反射破坏、反序列化破坏
懒汉式:

懒汉式多线程时会有问题
解决(双检锁):![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t4E93wR7-1663423712670)(C:\Users\86133\AppData\Roaming\Typora\typora-user-images\image-20220916105853057.png)]](https://1000bd.com/contentImg/2023/11/08/120646353.png)
懒汉式——静态内部类:
不用考虑线程安全问题
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uk71kvX1-1663423712670)(C:\Users\86133\AppData\Roaming\Typora\typora-user-images\image-20220916111405120.png)]](https://1000bd.com/contentImg/2023/11/08/120646342.png)
jdk中哪里使用了单例