什么是单例?
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例介绍:
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
优点:
1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
2、避免对资源的多重占用(比如写文件操作)。
缺点:
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
代码实现(传统实现):
/**
* 单例一:饿汉式
* @author 爱折腾的程序猿
* @version 1.0
* @date 2019/12/27 16:57
*/
public class Singleton_01 {
private static Singleton_01 instance = new Singleton_01();
private Singleton_01() {
}
public static Singleton_01 getInstance() {
return instance;
}
}
什么是序列化?
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
什么是序列化不安全?
序列化不安全指的是,同一个序列化对象,反序列化生成的对象不一致,这样单例就失去了意义,同时也成为了序列化攻击的漏洞。
如何解决饿汉式单例序列化不安全?
//解决序列化不安全
private Object readResolve(){
return instance;
}
解决序列化不安全(饿汉式升级版)
import java.io.Serializable;
/**
* 单例一:饿汉式
* @author 爱折腾的程序猿
* @version 1.0
* @date 2019/12/27 16:57
*/
public class Singleton_01 implements Serializable {
private static Singleton_01 instance = new Singleton_01();
private Singleton_01() {
}
public static Singleton_01 getInstance() {
return instance;
}
//解决序列化不安全
private Object readResolve(){
return instance;
}
}
饿汉式单例总结
一句话总结单例:
单例类在整个程序中只有一个实例,这个类负责创建自己的对象,并确保只有一个对象被创建
代码实现三个要点:
a) 私有构造器
b) 持有该类的属性
c) 对外提供获取实例的静态方法
传统饿汉式:
线程安全、反射不安全、反序列化不安全
升级后的饿汉式:
线程安全、反射不安全、反序列化安全
如何判断反射是否安全
反射安全:通过反射创建的对象是同一个对象
反射不安全:通过反射创建的对象是不同对象
如何判断反序列化是否安全
反序列化安全:通过反序列化创建的对象是同一个对象
反序列化不安全:通过反序列化创建的对象是不同对象
下节预告:下节讲述登记式单例的具体实现
网友评论