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; //返回单例

}

你可能感兴趣的:(1、单例模式)