枚举实现单例如何保证线程安全、反射安全、序列化安全

1. 线程安全:
enum是一个语法糖,编译后,声明的枚举实例其实对应一个用 static final修饰的变量,其初始化在静态块中完成。所以本质上线程安全也是通过类加载过程中,类构造器(< clinit >)的调用实现了同步。

2. 反射安全:
不允许对enum进行反射,否则直接抛异常。具体是现在 Constructor::newInstance()方法中,进行了类型判断,如果是Enum(每个枚举类的父类)类型,直接会抛异常。

3. 序列化安全:
Enum序列化与反序列化时的特殊性。
序列化时,对应ObjectOutputStream的void writeObject(Object obj)方法,该方法的具体实现中,会根据obj的具体类型实施不同的序列化方式。当为Enum类型时,只会把Enum中定义的属性name输出到结果中。
反序列化时,ObjectInputStream的Object readObject()方法发现需要反序列化的是Enum类型,就调用Enum的T valueOf(Class enumType,String name)方法,根据name拿到对应的枚举实例。这里补充一点,具体获取是获取对应单例类(实际继承与Enum,且每个枚举实例都用static final修饰)的类型描述信息,然后得到对应的枚举实例。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值