单例模式是一种设计模式,主要是为了创建唯一的实例对象。
单例模式的两种类型
懒汉式:只有在用到的时候才回去加载对象的实例
懒汉式创建实例对象在多线程情况下会有多例问题,可以使用锁可以双重验证的方式保证创建单例对象。
以上可以完整的创建出单例对对象,但是碰到指令重排情况下,由于时间差问题可能会出现A线程创建的实例还没被初始化的时候就被B线程获取。可以使用volatile关键字防止指令重排,保证程序指令的执行顺序与程序的顺序一致。
饿汉式:在类加载时就创建了对象的实例,等待被程序使用。
饿汉模式由于在类加载的时候就创建了实例可以保证创建出单例。
不管是懒汉式还是饿汉式都不能防止反射和序列化与反序列化创建出多例对象。
终极方案:为保证创建出唯一实例。可以使用枚举来创建单例对象。通过枚举创建出的单例在类加载时由JVM创建,创建出对象赋值给INSTANCE,之后再也不会实例化。并且枚举的构造器是私有的,在通过反射创建对象实例时JVM会判断被反射的类型是不是枚举类型,不是的话才能创建实例对象,是的话会自己抛出异常-反射攻击解决。枚举类型在序列化与反序列化时,JVM会对其特殊处理,在序列化时会将枚举的枚举名和枚举号存储在序列化数据中,反序列化时将其读出重新构造,保证单例的唯一性-序列化与反序列化解决。
Java的单例
最新推荐文章于 2024-09-15 09:47:04 发布