1、单例模式

单例模式:

保证一个类只有一个实例,并且提供一个访问该实例的全局访问点。

常见场景应用: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; //返回单例

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容