单例模式–面试
目标
- 掌握单例模式常见的五种实现方式
- 了解jdk中有那些地方体现了单例模式
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
0. 单例模式(Singleton)介绍
概念
指在一个系统中某个类只存在一个实例,类中自行实例化,实例像该系统提供统一的访问接口。
两种表现形式:
- 饿汉式:类加载时,就进行实例化;
- 懒汉式:第一次引用类才进行实例化。
五种实现方式
应用场景
一、单例模式之饿汉模式
代码
// 1. 饿汉式
public class Singleton1 implements Serializable{
// 1) 构造私有(构造不是私有的化容易被其他类改变)
private Singleton1(){
System.out.println("private Singleton1");
}
// 2) 提供一个静态私有成员变量
private static final Singleton1 INSTANCE = new Singleton1();
// 3) 提供一个公共的静态方法,返回私有变量
public static Singleton1 getInstance(){
return INSTANCE;
}
// 为了测试是饿汉式还是懒汉式
public static void otherMethod(){
System.out.println("otherMethod");
}
}
对构造方法进行私有化,可以保证不被外部代码直接实例化。并且由于构造函数私有,该例无法被继承。
实例
需要提前加载单例(Singleton1.otherMethod())
破坏单例的场景
反射破坏单例
如何预防?
// 预防反射破坏
private Singleton1(){
if(INSTANCE!=null){
throw new RuntimeEXception("单例对象不能重复创建");
}
System.out.println("private Singleton1");
}
反序列化破坏单例
预防:
// 在进行反序列化破坏单例时(对readResolve()方法进行重写)将自动调用下面的函数,将单例原封不断的返回
public Object readResolve(){
return INSTANCE;
}
Unsafe破坏单例
二、单例模式之枚举饿汉式
代码
在这里插入代码片