Java的单例

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值