单例模式:
保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。
常见场景应用:Windows的任务管理器、读配置文件的类、数据库连接池
优点:只生成一个实例,减少系统性能开销
五种单例模式实现方式
主要:
饿汉式(线程安全,调用效率高,但是不能延时加载)
懒汉式(线程安全,调用效率不高,但是可以延时加载)
其他:
双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
静态内部类式(线程安全,调用效率高,可以延时加载)
枚举单例(线程安全,调用效率高,不能延时加载)
如何选用:当需要延时加载时:枚举式>饿汉式
当不需要延时加载时:静态内部类式>懒汉式
枚举方式最安全,因为不会被反射和反序列化进行破解
反射和反序列化破解单例模式
应对方式:在单例子中的私有构造函数中添加这句话
使用反序列破解单例模式
//序列化
FileOutputStream
fos = new FileOutputStream(path);
ObjectOutputStreamoos = new ObjectOutputStream();
oos.writeObject(s1); //s1单例对象
oos.close();
fos.close();
//反序列化
ObjectInputStream
ois = new ObjectInputStream(new FileInputStream(path));
SingletonDemo2
s2 = ois.readObject();
System.out.println(s2);
应对方法
在单例类中加上一个方法
private
Object readResolve() throws ObjectStreamException(){
return
instance; //返回单例
}
网友评论